/ Hex Artifact Content
Login

Artifact 28f45e60d9a173368872d6e688e7a848c3926344:


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 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 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 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 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 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 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 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  f.};../*.** A op
5240: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
5250: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
5260: 73 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20  struct Pager. A 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
5280: 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f  * some of the mo
5290: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d  re important mem
52a0: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f  ber variables fo
52b0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74  llows:.**.** eSt
52c0: 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ate.**.**   The 
52d0: 63 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20  current 'state' 
52e0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
52f0: 65 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  ect. See the com
5300: 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a  ment and state.*
5310: 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76  *   diagram abov
5320: 65 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  e for a descript
5330: 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
5340: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c   state..**.** eL
5350: 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  ock.**.**   For 
5360: 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64  a real on-disk d
5370: 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72  atabase, the cur
5380: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
5390: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
53a0: 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  ile -.**   NO_LO
53b0: 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
53c0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
53d0: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
53e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  ..**.**   For a 
53f0: 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
5400: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
5410: 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63  (neither of whic
5420: 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a  h require any.**
5430: 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20     locks), this 
5440: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
5450: 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53  ys set to EXCLUS
5460: 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20  IVE_LOCK. Since 
5470: 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61  such.**   databa
5480: 73 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20  ses always have 
5490: 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d  Pager.exclusiveM
54a0: 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69  ode==1, this tri
54b0: 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  cks the pager.**
54c0: 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68     logic into th
54d0: 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61  inking that it a
54e0: 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74  lready has all t
54f0: 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c  he locks it will
5500: 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20   ever.**   need 
5510: 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74  (and no reason t
5520: 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e  o release them).
5530: 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65  .**.**   In some
5540: 20 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75   (obscure) circu
5550: 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76  mstances, this v
5560: 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f  ariable may also
5570: 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20   be set to.**   
5580: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
5590: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
55a0: 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
55b0: 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  of UNKNOWN_LOCK 
55c0: 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73  for.**   details
55d0: 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f  ..**.** changeCo
55e0: 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20  untDone.**.**   
55f0: 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72  This boolean var
5600: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
5610: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5620: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5630: 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d  er .**   (the 4-
5640: 62 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c  byte header fiel
5650: 64 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74  d at byte offset
5660: 20 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62   24 of the datab
5670: 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a  ase file) is .**
5680: 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d     not updated m
5690: 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e  ore often than n
56a0: 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a  ecessary. .**.**
56b0: 20 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20     It is set to 
56c0: 74 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68  true when the ch
56d0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
56e0: 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77  ld is updated, w
56f0: 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f  hich .**   can o
5700: 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e  nly happen if an
5710: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
5720: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
5730: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
5740: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
5750: 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20   (set to false) 
5760: 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c  whenever an excl
5770: 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  usive lock is .*
5780: 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64  *   relinquished
5790: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
57a0: 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65   file. Each time
57b0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
57c0: 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20  s committed,.** 
57d0: 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e    The changeCoun
57e0: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e  tDone flag is in
57f0: 73 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69  spected. If it i
5800: 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b  s true, the work
5810: 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e   of.**   updatin
5820: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
5830: 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  nter is omitted 
5840: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
5850: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
5860: 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e  **   This mechan
5870: 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ism means that w
5880: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  hen running in e
5890: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61  xclusive mode, a
58a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
58b0: 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61    need only upda
58c0: 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
58d0: 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20  unter once, for 
58e0: 74 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61  the first transa
58f0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69  ction.**   commi
5900: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d  tted..**.** setM
5910: 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68  aster.**.**   Wh
5920: 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  en PagerCommitPh
5930: 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c  aseOne() is call
5940: 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74  ed to commit a t
5950: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
5960: 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20  ay.**   (or may 
5970: 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d  not) specify a m
5980: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
5990: 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  me to be written
59a0: 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20   into the .**   
59b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
59c0: 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64  ore it is synced
59d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
59e0: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
59f0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
5a00: 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65  contains a maste
5a10: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5a20: 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20  r affects .**   
5a30: 74 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68  the way in which
5a40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5a50: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61  e is finalized a
5a60: 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
5a70: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f  tion is .**   co
5a80: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
5a90: 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e  d back when runn
5aa0: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5ab0: 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f  mode=PERSIST" mo
5ac0: 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f  de..**   If a jo
5ad0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
5ae0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  not contain a ma
5af0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b00: 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20  nter, it is.**  
5b10: 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76   finalized by ov
5b20: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5b30: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
5b40: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20  er with zeroes. 
5b50: 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20  If.**   it does 
5b60: 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72  contain a master
5b70: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5b80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5b90: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a  e is finalized .
5ba0: 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69  **   by truncati
5bb0: 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79  ng it to zero by
5bc0: 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20  tes, just as if 
5bd0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
5be0: 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e  ere .**   runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64  de=truncate" mod
5c10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e  e..**.**   Journ
5c20: 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f  al files that co
5c30: 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75  ntain master jou
5c40: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61  rnal pointers ca
5c50: 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65  nnot be finalize
5c60: 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79  d.**   simply by
5c70: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c80: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
5c90: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5ca0: 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d  s, as the.**   m
5cb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
5cc0: 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65  inter could inte
5cd0: 72 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a  rfere with hot-j
5ce0: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
5cf0: 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73  of any.**   subs
5d00: 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75  equently interru
5d10: 70 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  pted transaction
5d20: 20 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65   that reuses the
5d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
5d40: 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20  *.**   The flag 
5d50: 69 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f  is cleared as so
5d60: 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  on as the journa
5d70: 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69  l file is finali
5d80: 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20  zed (either.**  
5d90: 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50   by PagerCommitP
5da0: 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72  haseTwo or Pager
5db0: 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e  Rollback). If an
5dc0: 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e   IO error preven
5dd0: 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72  ts the.**   jour
5de0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
5df0: 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ing successfully
5e00: 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
5e10: 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a  setMaster flag.*
5e20: 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61  *   is cleared a
5e30: 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70  nyway (and the p
5e40: 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74  ager will move t
5e50: 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a  o ERROR state)..
5e60: 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c  **.** doNotSpill
5e70: 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  , doNotSyncSpill
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74  .**.**   These t
5e90: 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  wo boolean varia
5ea0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5eb0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65 74  */..  u8 bUseFet
7c70: 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
7c80: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7c90: 20 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 69   xFetch() */.  i
7ca0: 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20  nt nMmapOut;    
7cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7cc0: 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61 67  mber of mmap pag
7cd0: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74  es currently out
7ce0: 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71  standing */.  sq
7cf0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d  lite3_int64 mxMm
7d00: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 73  ap;       /* Des
7d10: 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  ired maximum mma
7d20: 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64  p size */.  PgHd
7d30: 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r *pMmapFreelist
7d40: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
7d50: 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61 67  of free mmap pag
7d60: 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72 74  e headers (pDirt
7d70: 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20  y) */.  /*.  ** 
7d80: 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69  End of the routi
7d90: 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c  nely-changing cl
7da0: 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a  ass members.  **
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31  *********/..  u1
7e00: 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  6 nExtra;       
7e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
7e20: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
7e30: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
7e40: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36  ry page */.  i16
7e50: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
7e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7e70: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
7e80: 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63  es at end of eac
7e90: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  h page */.  u32 
7ea0: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
7eb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
7ec0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
7ed0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33  .xOpen() */.  u3
7ee0: 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  2 sectorSize;   
7ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
7f00: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
7f10: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
7f20: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
7f30: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7f40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7f50: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
7f60: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b  /.  Pgno mxPgno;
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
7f90: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ed size of the d
7fa0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34  atabase */.  i64
7fb0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69   journalSizeLimi
7fc0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  t;       /* Size
7fd0: 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69   limit for persi
7fe0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
7ff0: 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  les */.  char *z
8000: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
8010: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8020: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8030: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
8040: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
8050: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
8060: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
8070: 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
8080: 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20  andler)(void*); 
8090: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
80a0: 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f  all when busy */
80b0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
80c0: 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f  ndlerArg;      /
80d0: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65  * Context argume
80e0: 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64  nt for xBusyHand
80f0: 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74  ler */.  int aSt
8100: 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  at[3];          
8110: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61       /* Total ca
8120: 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65 73  che hits, misses
8130: 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a 23   and writes */.#
8140: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8150: 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  T.  int nRead;  
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
8180: 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66  s read */.#endif
8190: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
81a0: 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f  ter)(DbPage*); /
81b0: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
81c0: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
81d0: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
81e0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
81f0: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
8200: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
8210: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
8220: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
8230: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
8240: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
8250: 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
8260: 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69  nt,int); /* Noti
8270: 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20  fy of page size 
8280: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69  changes */.  voi
8290: 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
82a0: 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20  void*);         
82b0: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
82c0: 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20  r for the codec 
82d0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
82e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
82f0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
8300: 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20  nt to xCodec... 
8310: 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69  methods */.#endi
8320: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
8330: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
8340: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
8350: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8360: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
8370: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
8380: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8390: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
83a0: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
83b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
83c0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a  OMIT_WAL.  Wal *
83d0: 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pWal;           
83e0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d         /* Write-
83f0: 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62  ahead log used b
8400: 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  y "journal_mode=
8410: 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a  wal" */.  char *
8420: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
8430: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
8440: 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65  me for write-ahe
8450: 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66  ad log */.#endif
8460: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78  .};../*.** Index
8470: 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  es for use with 
8480: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54  Pager.aStat[]. T
8490: 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  he Pager.aStat[]
84a0: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a   array contains.
84b0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63  ** the values ac
84c0: 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e  cessed by passin
84d0: 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  g SQLITE_DBSTATU
84e0: 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43  S_CACHE_HIT, CAC
84f0: 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43  HE_MISS .** or C
8500: 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71  ACHE_WRITE to sq
8510: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8520: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8530: 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30  GER_STAT_HIT   0
8540: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8550: 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66  TAT_MISS  1.#def
8560: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57  ine PAGER_STAT_W
8570: 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68  RITE 2../*.** Th
8580: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
8590: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
85a0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
85b0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
85c0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
85d0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
85e0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
85f0: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
8600: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
8610: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
8620: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
8630: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8640: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
8650: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
8660: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8670: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
8680: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
8690: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86a0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
86b0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
86c0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
86d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
86e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86f0: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
8700: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
8710: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
8720: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
8730: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
8740: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
8750: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
8760: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
8770: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
8780: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
8790: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
87a0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
87b0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
87c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
87d0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
87e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
87f0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
8800: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
8810: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
8820: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8830: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
8840: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
8850: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8860: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
8870: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
8880: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
8890: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
88a0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
88b0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
88c0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
88d0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
88e0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
88f0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
8900: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
8910: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
8920: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
8930: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
8940: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
8950: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
8960: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8970: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
8980: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
8990: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
89a0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
89b0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
89c0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
89d0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
89e0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
89f0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8a00: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
8a10: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
8a20: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
8a30: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
8a40: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
8a50: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8a60: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
8a70: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
8a80: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
8a90: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
8aa0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
8ab0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
8ac0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
8ad0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
8ae0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
8af0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
8b00: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
8b10: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
8b20: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
8b30: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
8b40: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
8b50: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
8b60: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
8b70: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
8b80: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
8b90: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
8ba0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
8bb0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
8bc0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
8bd0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
8be0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
8bf0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
8c00: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
8c10: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
8c20: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
8c30: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
8c40: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
8c50: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
8c60: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
8c70: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
8c80: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
8c90: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
8ca0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
8cb0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
8cc0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
8cd0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
8ce0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
8cf0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
8d00: 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67   the of each pag
8d10: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
8d20: 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e  journal is given
8d30: 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   by.** the follo
8d40: 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  wing macro..*/.#
8d50: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
8d60: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
8d70: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8d80: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
8d90: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
8da0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
8db0: 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73  ager. This is us
8dc0: 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a  ually the same .
8dd0: 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e  ** size as a sin
8de0: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
8df0: 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63   See also setSec
8e00: 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64  torSize()..*/.#d
8e10: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
8e20: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
8e30: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
8e40: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
8e50: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
8e60: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
8e70: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
8e80: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
8e90: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
8ea0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
8eb0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
8ec0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
8ed0: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
8ee0: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
8ef0: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
8f00: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
8f10: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
8f20: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
8f30: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
8f40: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
8f50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
8f60: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
8f70: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
8f80: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
8f90: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
8fa0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  f../*.** The mac
8fb0: 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20 74  ro USEFETCH is t
8fc0: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61 6c  rue if we are al
8fd0: 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68 65  lowed to use the
8fe0: 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e 66   xFetch and xUnf
8ff0: 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63  etch.** interfac
9000: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
9010: 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
9020: 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f  memory-mapped I/
9030: 4f 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  O..*/.#ifdef SQL
9040: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4d 4d 41 50  ITE_DISABLE_MMAP
9050: 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54  .# define USEFET
9060: 43 48 28 78 29 20 30 0a 23 65 6c 73 65 0a 23 20  CH(x) 0.#else.# 
9070: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9080: 78 29 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74  x) ((x)->bUseFet
9090: 63 68 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ch).#endif../*.*
90a0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
90b0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
90c0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
90d0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
90e0: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
90f0: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  647../*.** The a
9100: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
9110: 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20  macro is a file 
9120: 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65  descriptor (type
9130: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e   sqlite3_file*).
9140: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
9150: 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  it is not open, 
9160: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74  or non-zero (but
9170: 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73   not 1) if it is
9180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9190: 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69  so that expressi
91a0: 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74  ons can be writt
91b0: 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  en as:.**.**   i
91c0: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
91d0: 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a  ->jfd) ){ ....**
91e0: 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  .** instead of.*
91f0: 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65  *.**   if( pPage
9200: 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
9210: 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69   ){ ....*/.#defi
9220: 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28  ne isOpen(pFd) (
9230: 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29  (pFd)->pMethods)
9240: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9250: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
9260: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
9270: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
9280: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
9290: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
92a0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
92b0: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
92c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73  QLITE_OMIT_WAL.s
92d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
92e0: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
92f0: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ger){.  return (
9300: 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29  pPager->pWal!=0)
9310: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
9320: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
9330: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9340: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
9350: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9360: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
9370: 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  ,y) 0.# define p
9380: 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
9390: 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  sent(z) SQLITE_O
93a0: 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  K.# define pager
93b0: 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
93c0: 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f  tion(z) SQLITE_O
93d0: 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
93e0: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
93f0: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
9400: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
9410: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
9420: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ) );.**.** This 
9430: 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61  function runs ma
9440: 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72  ny asserts to tr
9450: 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73  y to find incons
9460: 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20  istencies in.** 
9470: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
9480: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
9490: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
94a0: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
94b0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
94c0: 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  p){.  Pager *pPa
94d0: 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53  ger = p;..  /* S
94e0: 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c  tate must be val
94f0: 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  id. */.  assert(
9500: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9510: 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c  R_OPEN.       ||
9520: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9530: 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20  R_READER.       
9540: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9550: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9560: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9570: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9580: 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
9590: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
95a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
95b0: 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
95c0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
95d0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a  WRITER_FINISHED.
95e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
95f0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
9600: 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61  .  );..  /* Rega
9610: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75  rdless of the cu
9620: 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74  rrent state, a t
9630: 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74  emp-file connect
9640: 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76  ion always behav
9650: 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74  es.  ** as if it
9660: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
9670: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
9680: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
9690: 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20  never updates.  
96a0: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ** the change-co
96b0: 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20  unter field, so 
96c0: 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
96d0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
96e0: 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  ys set..  */.  a
96f0: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9700: 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63  le==0 || p->eLoc
9710: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
9720: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9730: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9740: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9750: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f  ountDone );..  /
9760: 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72  * If the useJour
9770: 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nal flag is clea
9780: 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  r, the journal-m
9790: 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46  ode must be "OFF
97a0: 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  ". .  ** And if 
97b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
97c0: 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a   is "OFF", the j
97d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
97e0: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   not be open..  
97f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9800: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9810: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9820: 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72  FF || p->useJour
9830: 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
9840: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21   p->journalMode!
9850: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9860: 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65  DE_OFF || !isOpe
9870: 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  n(p->jfd) );..  
9880: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45  /* Check that ME
9890: 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79  MDB implies noSy
98a0: 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65  nc. And an in-me
98b0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  mory journal. Si
98c0: 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d  nce .  ** this m
98d0: 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eans an in-memor
98e0: 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73  y pager performs
98f0: 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69   no IO at all, i
9900: 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74  t cannot encount
9910: 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  er .  ** either 
9920: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
9930: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69  SQLITE_FULL duri
9940: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77  ng rollback or w
9950: 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20  hile finalizing 
9960: 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
9970: 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20  file. (although 
9980: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  the in-memory jo
9990: 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  urnal implementa
99a0: 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72  tion may .  ** r
99b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
99c0: 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74  RR_NOMEM while t
99d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
99e0: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
99f0: 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74  ). It .  ** is t
9a00: 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73  herefore not pos
9a10: 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d  sible for an in-
9a20: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20  memory pager to 
9a30: 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
9a40: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a  .  ** state..  *
9a50: 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
9a60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9a70: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
9a80: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9a90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9aa0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9ab0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9ac0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ad0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
9ae0: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
9af0: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
9b00: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
9b10: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
9b20: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
9b30: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
9b40: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
9b50: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
9b60: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
9b70: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
9b80: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
9b90: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
9ba0: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
9bb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9bc0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
9bd0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
9be0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9bf0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9c00: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
9c10: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
9c20: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
9c30: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
9c40: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
9c50: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
9c60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9c70: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9c80: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9c90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ca0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
9cb0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
9cc0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
9cd0: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
9ce0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9cf0: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
9d00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9d10: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9d20: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9d40: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9d50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9d60: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
9d70: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
9d80: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9d90: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
9da0: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
9db0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9dc0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9dd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9de0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9df0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9e00: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
9e10: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9e20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9e30: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9e40: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
9e50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9e60: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
9e70: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
9e80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9e90: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
9ea0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
9eb0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
9ec0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ed0: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
9ee0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
9ef0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9f00: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9f10: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
9f20: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
9f40: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
9f50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9f60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9f70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9f80: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9f90: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9fa0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
9fb0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
9fc0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
9fd0: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
9fe0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
9ff0: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a000: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a010: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a020: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a030: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a040: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a050: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a060: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a070: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a080: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a090: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a0a0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a0b0: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a0c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a0d0: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a0e0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a0f0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a100: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a110: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a120: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a130: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a150: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a160: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a170: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a190: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a1a0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a1b0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a1c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1d0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a1e0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a1f0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a200: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a210: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a220: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a230: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a240: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a250: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a260: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a270: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a280: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a290: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a2a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a2b0: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a2c0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a2d0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a2e0: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a2f0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a300: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a310: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a320: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a330: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a340: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a350: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a360: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a370: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
a380: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a390: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a3a0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a3b0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
a3c0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a3d0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a3e0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a3f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a400: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a410: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a420: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
a430: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
a440: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a450: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a460: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a470: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a480: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a490: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a4a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a4b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a4c0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a4d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a4e0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
a4f0: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
a500: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
a510: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
a520: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
a530: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
a540: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
a550: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
a560: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
a570: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
a580: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
a590: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
a5a0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a5b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a5c0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
a5d0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a5e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
a5f0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
a600: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
a610: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a620: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a630: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a640: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a650: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a660: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a670: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a680: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a690: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a6a0: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a6b0: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a6c0: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a6d0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a6e0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a6f0: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a700: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a710: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a720: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a730: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a740: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
a750: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
a760: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
a770: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
a780: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
a790: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
a7a0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
a7b0: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
a7c0: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
a7d0: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
a7e0: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
a7f0: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
a800: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
a810: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
a820: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
a830: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
a840: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
a850: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
a860: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
a870: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
a880: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
a890: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
a8a0: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
a8b0: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
a8c0: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
a8d0: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
a8e0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
a8f0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
a900: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
a910: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
a920: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
a930: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
a940: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
a950: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
a960: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
a970: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
a980: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
a990: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
a9a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a9b0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
a9c0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
a9d0: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
a9e0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a9f0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
aa00: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
aa10: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
aa20: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
aa30: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
aa40: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
aa50: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
aa60: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aa70: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
aa80: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
aa90: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
aaa0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
aab0: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
aac0: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
aad0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aae0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
aaf0: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
ab00: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ab10: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
ab20: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ab30: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
ab40: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
ab50: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
ab60: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ab70: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
ab80: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ab90: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
aba0: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
abb0: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
abc0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
abd0: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
abe0: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
abf0: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
ac00: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
ac10: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
ac20: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
ac30: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
ac40: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
ac50: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
ac60: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ac70: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
ac80: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
ac90: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aca0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
acb0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
acc0: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
acd0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ace0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
acf0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
ad00: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
ad10: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ad20: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ad30: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
ad40: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
ad50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
ad60: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
ad70: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
ad80: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
ad90: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
ada0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
adb0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
adc0: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
add0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
ade0: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
adf0: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
ae00: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
ae10: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
ae20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
ae30: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
ae40: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
ae50: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
ae60: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
ae70: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
ae80: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
ae90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
aea0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
aeb0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
aec0: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
aed0: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
aee0: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
aef0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
af00: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
af10: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
af20: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
af30: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
af40: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
af50: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
af60: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
af70: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
af80: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
af90: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
afa0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
afb0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
afc0: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
afd0: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
afe0: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
aff0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b000: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b010: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b020: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b030: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
b040: 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
b050: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
b060: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Pager;.  int i;.
b070: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b080: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b090: 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72   i++){.    Pager
b0a0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
b0b0: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b0c0: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b0d0: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b0e0: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b0f0: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
b100: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
b110: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
b120: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b130: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
b140: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b150: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b160: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b170: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b180: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b190: 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  al(PgHdr *pPg){.
b1a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b1b0: 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e  BitvecTest(pPg->
b1c0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
b1d0: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
b1e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
b1f0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b200: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b210: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b220: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b230: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b240: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b250: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b260: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b270: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b280: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b290: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b2a0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b2b0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b2c0: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b2d0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b2e0: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b2f0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b300: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b310: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b320: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b330: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b340: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b350: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b360: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b370: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b380: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b390: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b3b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b3c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b3d0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b3e0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b3f0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b400: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b410: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b420: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b430: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b440: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b450: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b460: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b470: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b480: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b490: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b4a0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b4b0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b4c0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b4d0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b4e0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b4f0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b500: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b510: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b520: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b530: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b540: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b550: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
b560: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b570: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
b580: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
b590: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
b5a0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
b5b0: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
b5c0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
b5d0: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
b5e0: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
b5f0: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
b600: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
b610: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
b620: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
b630: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b640: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b650: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b660: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b670: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
b680: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
b690: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
b6a0: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b6b0: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
b6c0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b6d0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
b6e0: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b6f0: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
b700: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
b710: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
b720: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b730: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
b740: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
b750: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
b760: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
b770: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b780: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
b790: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b7a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b7b0: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
b7c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
b7d0: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
b7e0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
b7f0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
b800: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
b810: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
b820: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
b830: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
b840: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ock);.    if( pP
b850: 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  ager->eLock!=UNK
b860: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
b870: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
b880: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
b890: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
b8a0: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
b8b0: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
b8c0: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
b8d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
b8e0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b8f0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b900: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b910: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
b920: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
b930: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
b940: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
b950: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
b960: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
b970: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
b980: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
b990: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
b9a0: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
b9b0: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b9c0: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b9d0: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b9e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
b9f0: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
ba00: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
ba10: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
ba20: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
ba30: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
ba40: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
ba50: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
ba60: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
ba70: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
ba80: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
ba90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
baa0: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
bab0: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
bac0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
bad0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
bae0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
baf0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
bb00: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
bb10: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
bb20: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
bb30: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
bb40: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
bb50: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
bb60: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
bb70: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
bb80: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bb90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bba0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
bbb0: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
bbc0: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
bbd0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
bbe0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bbf0: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bc00: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
bc10: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
bc20: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bc30: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
bc40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bc50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bc60: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bc70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bc80: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bc90: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
bca0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bcb0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
bcc0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bcd0: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bce0: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bcf0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bd00: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bd10: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bd20: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bd30: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bd40: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bd50: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
bd60: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
bd70: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
bd80: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
bd90: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
bda0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
bdb0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
bdc0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bdd0: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
bde0: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
bdf0: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
be00: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
be10: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
be20: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
be30: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
be40: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
be50: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
be60: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
be70: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
be80: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
be90: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
bea0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
beb0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
bec0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
bed0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
bee0: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
bef0: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
bf00: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
bf10: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
bf20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
bf30: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
bf40: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
bf50: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
bf60: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
bf70: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
bf80: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
bf90: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
bfc0: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
bfd0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
bfe0: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
bff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c000: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c010: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c040: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c050: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c060: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c070: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c080: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c090: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c0a0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c0b0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c0c0: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c0d0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c0e0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c0f0: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c100: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c110: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c120: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c130: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c140: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c150: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c160: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c170: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c180: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c190: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c1a0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c1b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c1c0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c1d0: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c1e0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c1f0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c200: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c210: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c220: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c230: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c240: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c250: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c260: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c270: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c280: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c290: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c2a0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c2b0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c2c0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c2d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c2e0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c2f0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c300: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c310: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c320: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c330: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c340: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c350: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c360: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c370: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c380: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c390: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c3a0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c3b0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c3c0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c3d0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c3e0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c3f0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c400: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c410: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c420: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c430: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c440: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c460: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c470: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c480: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c490: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c4a0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c4b0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c4c0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c4d0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c4e0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c4f0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c500: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c510: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c520: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c530: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c540: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c550: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c560: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c570: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c580: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c590: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c5a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c5b0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c5c0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c5d0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c5e0: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c5f0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c600: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c610: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c620: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c630: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c640: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c650: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c660: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c670: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c680: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c690: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c6a0: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c6b0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c6c0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c6d0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c6e0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c6f0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c700: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c710: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c720: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c730: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c740: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c750: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
c760: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
c770: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
c780: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
c790: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
c7a0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
c7b0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
c7c0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
c7d0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
c7e0: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
c7f0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
c800: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
c810: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
c820: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
c830: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
c840: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
c850: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
c860: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
c870: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
c880: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
c890: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
c8a0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
c8b0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
c8c0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
c8d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
c8e0: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
c8f0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
c900: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
c910: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
c920: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
c930: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
c940: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
c950: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
c960: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
c970: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
c980: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
c990: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
c9a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
c9b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c9c0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
c9d0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c9e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
c9f0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
ca00: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
ca10: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
ca20: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
ca30: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
ca40: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
ca50: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
ca60: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
ca70: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
ca80: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
ca90: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
caa0: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cab0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cac0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cad0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
cae0: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
caf0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
cb00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cb10: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cb20: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cb30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cb40: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cb50: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
cb60: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cb70: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
cb80: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
cb90: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cba0: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
cbb0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cbc0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cbd0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cbe0: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cbf0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cc00: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
cc10: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cc20: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cc30: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cc50: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cc60: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cc70: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cc80: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cca0: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
ccb0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
ccc0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
ccf0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cd00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cd10: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cd20: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cd30: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cd40: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cd50: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
cd60: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cd70: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cd80: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
cd90: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
cda0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cdb0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cdc0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
cdd0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
cde0: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
cdf0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ce00: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
ce10: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
ce20: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
ce30: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
ce40: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
ce50: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
ce60: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
ce70: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
ce80: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
ce90: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cea0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
ceb0: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
cec0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
ced0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
cee0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
cef0: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
cf00: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
cf10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cf20: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
cf30: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
cf40: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
cf50: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
cf60: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
cf70: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
cf80: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
cf90: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
cfa0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
cfb0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
cfc0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
cfd0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
cfe0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
cff0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
d000: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
d010: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
d020: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
d030: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
d040: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
d050: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
d060: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
d070: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
d080: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
d090: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
d0a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d0b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d0c0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
d0d0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
d0e0: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
d0f0: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
d100: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
d110: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
d120: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
d130: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
d140: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d150: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
d160: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
d170: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
d180: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
d190: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
d1a0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1d0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d200: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d210: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d220: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d230: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d240: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d260: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d270: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d280: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d290: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d2a0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d2b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d2c0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d2d0: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d2e0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d2f0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d300: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d310: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d320: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d330: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d340: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d350: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d360: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d370: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d380: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d390: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d3a0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d3b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d3c0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d3d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d3e0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d400: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d410: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d420: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
d430: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
d440: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
d450: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
d460: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
d470: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
d480: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
d490: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
d4a0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d4b0: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
d4c0: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
d4d0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
d4e0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
d4f0: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
d500: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
d510: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
d520: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
d530: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
d540: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
d550: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
d560: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
d570: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
d580: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
d590: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
d5a0: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
d5b0: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
d5c0: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
d5d0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
d5e0: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
d5f0: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
d600: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
d610: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
d620: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
d630: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
d640: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
d650: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
d660: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
d670: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
d680: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
d690: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
d6a0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
d6b0: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
d6c0: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
d6d0: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
d6e0: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
d6f0: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
d700: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
d710: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
d720: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
d730: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
d740: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
d750: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
d760: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
d770: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
d780: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
d790: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
d7a0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
d7b0: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
d7c0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
d7d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
d800: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
d810: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
d820: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
d830: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
d840: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
d850: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
d860: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
d870: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
d880: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
d890: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
d8a0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
d8b0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
d8c0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
d8d0: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
d8e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d8f0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
d900: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
d910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d920: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
d930: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
d940: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
d950: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
d960: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
d970: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
d980: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
d990: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d9a0: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
d9b0: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
d9c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d9d0: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
d9e0: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
d9f0: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
da00: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
da10: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
da20: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
da30: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
da40: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
da50: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
da60: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
da70: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
da80: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
da90: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
daa0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
dab0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
dac0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
dad0: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
dae0: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
daf0: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
db00: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
db10: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
db20: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
db30: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
db40: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
db50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
db60: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
db70: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
db80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
db90: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
dba0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
dbb0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
dbc0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
dbd0: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
dbe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
dbf0: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
dc00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dc10: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dc20: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
dc30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dc40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dc50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
dc60: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
dc70: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
dc80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
dc90: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
dca0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
dcb0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
dcc0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
dcd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dce0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
dcf0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
dd00: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
dd10: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
dd20: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
dd30: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
dd40: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
dd50: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
dd60: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
dd70: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
dd80: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
dd90: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
dda0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
ddb0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
ddc0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
ddd0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
dde0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
ddf0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
de00: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
de10: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
de20: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
de30: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
de40: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
de50: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
de60: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
de70: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
de80: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
de90: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
dea0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
deb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
dec0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
ded0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
dee0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
def0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df00: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
df10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
df20: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
df30: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
df40: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
df50: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
df60: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
df70: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
df80: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
df90: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
dfa0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
dfb0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
dfc0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
dfe0: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
dff0: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e000: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e030: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e040: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e050: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e060: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e070: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e080: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e090: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e0a0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e0b0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e0c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e0d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e0e0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e0f0: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e100: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e110: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e120: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e130: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e140: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e150: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e160: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e170: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e180: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e190: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e1a0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e1b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e1c0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e1d0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e1e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e1f0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e200: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e210: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e220: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e230: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e240: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e250: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e260: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e270: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e280: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e290: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e2a0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e2b0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e2c0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e2d0: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e2e0: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e2f0: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e300: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e310: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e320: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e330: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e340: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e350: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e360: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e370: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e380: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e390: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e3a0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e3b0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e3c0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e3d0: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e3e0: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e3f0: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e400: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e410: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e430: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e440: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e450: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e460: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e470: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e480: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e490: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e4a0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e4b0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e4c0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e4d0: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e4f0: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e500: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e510: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e520: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e530: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e540: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e550: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e560: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e570: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e580: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e590: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e5a0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e5b0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e5c0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
e5d0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e5e0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
e5f0: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
e600: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
e610: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
e620: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
e630: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
e640: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
e650: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
e660: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e670: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
e680: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
e690: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
e6a0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
e6b0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
e6c0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
e6d0: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
e6e0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
e6f0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
e700: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
e710: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
e720: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
e730: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
e740: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
e750: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e760: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
e770: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e780: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e790: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
e7a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
e7b0: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
e7c0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e7d0: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
e7e0: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
e7f0: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
e800: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
e810: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
e820: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
e830: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
e840: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e850: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
e860: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e870: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
e880: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e890: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
e8a0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
e8b0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
e8c0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e8d0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e8e0: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
e8f0: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
e900: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
e910: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
e920: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
e930: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e940: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e950: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
e960: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
e970: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
e980: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
e990: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e9a0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e9b0: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
e9c0: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
e9d0: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
e9e0: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
e9f0: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ea00: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ea10: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
ea20: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
ea30: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
ea40: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
ea50: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ea60: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
ea70: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
ea80: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
ea90: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
eaa0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
eab0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
eac0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
ead0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eae0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eaf0: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
eb00: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
eb10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eb20: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
eb30: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
eb40: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
eb50: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
eb60: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
eb70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
eb80: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
eb90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
eba0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
ebb0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
ebc0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
ebd0: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
ebe0: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
ebf0: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
ec00: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
ec10: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
ec20: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
ec30: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
ec40: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
ec50: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
ec60: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
ec70: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
ec80: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
ec90: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
eca0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
ecb0: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
ecc0: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
ecd0: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
ece0: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
ecf0: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
ed00: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
ed10: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
ed20: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
ed30: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
ed40: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
ed50: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
ed60: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
ed70: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
ed80: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
ed90: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
eda0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
edb0: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
edc0: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
edd0: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
ede0: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
edf0: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
ee00: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
ee10: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
ee20: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
ee30: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
ee40: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
ee50: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
ee60: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
ee70: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
ee80: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
ee90: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
eea0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
eeb0: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
eec0: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
eed0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
eee0: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
eef0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ef00: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
ef10: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
ef20: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
ef30: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
ef40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
ef50: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
ef60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
ef70: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
ef80: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
ef90: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
efa0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
efb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
efc0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
efd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
efe0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
eff0: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f000: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f010: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f020: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f030: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f040: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f050: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f060: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f070: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f080: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f090: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f0a0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f0b0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f0c0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f0d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f0e0: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f0f0: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f100: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f110: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f120: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f130: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f140: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f150: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f160: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f170: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f180: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f190: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f1a0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f1b0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f1c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f1d0: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f1e0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f1f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f200: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f210: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f220: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f230: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f240: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f250: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f260: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f270: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f280: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f290: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f2a0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f2c0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f2d0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f2e0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f2f0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f300: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f310: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f320: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f330: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f340: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f350: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f360: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f370: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f380: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f390: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f3a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f3c0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f3d0: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f3e0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f400: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f410: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f420: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f430: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f440: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f450: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f460: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f470: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f490: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f4a0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f4b0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f4c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f4f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f500: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f510: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f520: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f530: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f540: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f560: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f570: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f580: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f590: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f5a0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f5b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f5c0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
f5d0: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
f5e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
f5f0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
f600: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
f610: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
f620: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
f630: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
f640: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
f650: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
f660: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
f670: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
f680: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f690: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
f6a0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
f6b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
f6c0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
f6d0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
f6e0: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
f6f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f700: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
f710: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
f720: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
f730: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
f740: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
f750: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f760: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
f770: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
f780: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
f790: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
f7a0: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
f7b0: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
f7c0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
f7d0: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
f7e0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
f7f0: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
f800: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
f810: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
f820: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
f830: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
f840: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
f850: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f860: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
f870: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
f880: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
f890: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
f8a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f8b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f8c0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
f8d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
f8e0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
f8f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f900: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
f910: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
f920: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
f930: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
f940: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f950: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
f960: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
f970: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
f980: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
f990: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
f9a0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
f9b0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f9c0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
f9d0: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
f9e0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
f9f0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
fa00: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fa10: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fa20: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
fa30: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
fa40: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fa50: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fa60: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
fa70: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
fa80: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
fa90: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
faa0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fab0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fac0: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
fad0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fae0: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
faf0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
fb00: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
fb10: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
fb20: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
fb30: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
fb40: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
fb50: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb70: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
fb80: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
fb90: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
fba0: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
fbb0: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
fbc0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fbd0: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
fbe0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
fbf0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fc00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fc10: 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
fc20: 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
fc30: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
fc40: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
fc50: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
fc60: 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
fc70: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
fc80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fc90: 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
fca0: 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
fcb0: 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
fcc0: 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
fcd0: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
fce0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
fcf0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
fd00: 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
fd10: 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
fd20: 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
fd30: 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
fd40: 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
fd50: 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
fd60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
fd70: 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
fd80: 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
fd90: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
fda0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
fdb0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
fdc0: 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
fdd0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
fde0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
fdf0: 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
fe00: 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
fe10: 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
fe20: 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
fe30: 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
fe40: 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
fe50: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
fe60: 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
fe70: 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
fe80: 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
fe90: 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
fea0: 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
feb0: 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
fec0: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fed0: 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
fee0: 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
fef0: 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
ff00: 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
ff10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
ff20: 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
ff30: 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
ff40: 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
ff50: 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
ff60: 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
ff70: 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
ff80: 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
ff90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
ffa0: 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
ffb0: 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
ffc0: 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
ffd0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
ffe0: 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
fff0: 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10000 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10010 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
10020 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
10030 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
10040 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
10050 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
10060 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
10070 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
10080 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10090 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
100a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
100b0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
100c0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
100d0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
100e0 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
100f0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10100 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10110 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
10120 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
10130 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
10140 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
10150 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
10160 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
10170 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10180 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10190 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
101a0 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
101b0 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
101c0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
101d0 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
101e0 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
101f0 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10200 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10210 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10220 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10230 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10240 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
10250 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
10260 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
10270 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
10280 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
10290 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
102a0 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
102b0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
102c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
102d0 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
102e0 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
102f0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10300 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10310 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10320 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10330 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10340 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
10350 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
10360 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
10370 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10380 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10390 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
103a0 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
103b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
103c0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
103d0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
103e0 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
103f0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10400 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10410 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10420 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10430 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10440 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
10450 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
10460 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
10470 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
10480 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10490 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
104a0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
104b0 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
104c0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
104d0 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
104e0 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
104f0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10500 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10510 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
10520 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10530 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
10540 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
10550 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
10560 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10570 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
10580 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
10590 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
105a0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
105b0 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
105c0 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
105d0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
105e0 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
105f0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10600 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10610 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
10620 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
10630 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
10640 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
10650 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
10660 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
10670 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10680 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10690 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
106a0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
106b0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
106c0 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
106d0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
106e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
106f0 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10700 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10710 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10720 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10750 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10760 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10780 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10790 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
107a0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
107d0 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
107e0 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
107f0 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10810 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10820 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10830 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10860 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10870 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10880 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
108a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
108b0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
108c0 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
108d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
108e0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
108f0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10900 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
10910 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
10920 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
10930 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10940 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
10950 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
10960 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
10970 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
10980 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
10990 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
109a0 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
109b0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
109c0 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
109d0 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
109e0 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
109f0 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10a00 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10a10 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10a20 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10a30 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10a40 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
10a50 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
10a60 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
10a70 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
10a80 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
10a90 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
10aa0 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10ab0 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10ac0 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10ad0 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10ae0 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10af0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10b00 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10b10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10b20 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10b30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10b40 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
10b50 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
10b60 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
10b70 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
10b80 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
10b90 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
10ba0 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
10bb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
10bc0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
10bd0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
10be0 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
10bf0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
10c00 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
10c10 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
10c20 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10c30 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10c40 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
10c50 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
10c60 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10c70 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10c80 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10c90 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
10ca0 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
10cb0 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10cc0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10cd0 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10ce0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
10cf0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10d00 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10d10 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10d20 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
10d30 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
10d40 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10d50 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10d60 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
10d70 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
10d80 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
10d90 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10da0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
10db0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10dc0 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
10dd0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
10de0 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
10df0 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
10e00 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
10e10 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
10e20 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
10e30 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
10e40 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10e50 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
10e60 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
10e70 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
10e80 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
10e90 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
10ea0 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
10eb0 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
10ec0 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
10ed0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
10ee0 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
10ef0 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
10f00 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
10f10 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
10f20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
10f30 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
10f40 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
10f50 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
10f60 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
10f70 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
10f80 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
10f90 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
10fa0 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
10fb0 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
10fc0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
10fd0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
10fe0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
10ff0 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
11000 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
11010 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
11020 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11030 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11040 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11050 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
11060 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11070 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
11080 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
11090 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
110a0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
110b0 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
110c0 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
110d0 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
110e0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
110f0 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
11100 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
11110 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
11120 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
11130 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
11140 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11170 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
11180 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
11190 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
111a0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
111b0 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
111c0 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
111d0 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
111e0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
111f0 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
11200 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
11210 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
11220 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
11230 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
11240 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
11250 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   p;.}../*.** Dis
11260 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20  card the entire 
11270 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11280 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63  in-memory page-c
11290 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ache..*/.static 
112a0 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
112b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
112c0 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
112d0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
112e0 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
112f0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
11300 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
11310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11320 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
11330 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
11340 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
11350 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
11360 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
11370 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
11380 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11390 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
113a0 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
113b0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
113c0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
113d0 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
113e0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
113f0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11400 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11410 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11420 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
11430 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
11440 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
11450 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
11460 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
11470 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
11480 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11490 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
114a0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
114b0 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
114c0 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
114d0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
114e0 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
114f0 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11500 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11510 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11520 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
11530 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11540 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
11550 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
11560 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
11570 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
11580 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11590 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
115a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
115b0 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
115c0 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
115d0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
115e0 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
115f0 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11600 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11610 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11620 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
11630 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
11640 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
11650 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
11660 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
11670 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
11680 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11690 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
116a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
116b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
116c0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
116d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
116e0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
116f0 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11700 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11710 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11720 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
11730 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
11740 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
11750 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
11760 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
11770 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
11780 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
11790 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
117a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
117b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
117c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
117d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
117e0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
117f0 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11810 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11820 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
11830 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
11840 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
11850 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
11860 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
11870 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
11880 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
11890 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
118a0 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
118b0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
118c0 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
118d0 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
118e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
118f0 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11900 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11910 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11920 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11930 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11940 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
11950 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11960 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
11970 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11980 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
11990 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
119a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
119b0 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
119c0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
119d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
119e0 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
119f0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11a00 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11a10 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11a20 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11a30 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11a40 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
11a50 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
11a60 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
11a70 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
11a80 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11a90 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11aa0 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11ab0 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11ac0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11ad0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11ae0 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11af0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11b00 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11b10 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11b20 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11b30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11b40 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
11b50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
11b60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11b70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
11b80 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
11b90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11ba0 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11bb0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11bc0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11bd0 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11be0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11bf0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11c00 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11c10 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11c20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11c30 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11c40 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11c50 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11c60 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11c70 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11c80 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11c90 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11ca0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11cb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11cc0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11cd0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11ce0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11cf0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11d00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11d20 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11d30 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11d40 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11d50 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11d60 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11d70 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11d80 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11d90 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11da0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11db0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11dc0 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11dd0 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11de0 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11df0 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11e00 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11e10 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11e20 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11e30 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
11e40 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
11e50 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
11e60 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
11e70 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
11e80 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
11e90 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11ea0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
11eb0 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
11ec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11ed0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11ee0 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
11ef0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11f00 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11f10 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
11f20 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11f30 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11f40 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
11f50 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
11f60 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11f70 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
11f80 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
11f90 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11fa0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
11fb0 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
11fc0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
11fd0 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
11fe0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
11ff0 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12000 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12010 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12020 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12030 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
12040 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
12050 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
12060 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
12070 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
12080 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12090 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
120a0 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
120b0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
120c0 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
120d0 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
120e0 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
120f0 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12100 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12110 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12120 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
12130 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
12140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
12150 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
12160 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
12170 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12180 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12190 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
121a0 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
121b0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
121c0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
121d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
121e0 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
121f0 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12200 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12210 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12220 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
12230 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
12240 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
12250 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
12260 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
12270 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
12280 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12290 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
122a0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
122b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
122c0 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
122d0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
122e0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
122f0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12300 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12310 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12320 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12330 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
12340 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
12350 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12360 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12370 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
12380 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12390 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
123a0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
123b0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
123c0 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
123d0 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
123e0 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
123f0 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12400 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12410 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12420 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
12430 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12440 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12450 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
12460 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
12470 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
12480 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12490 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
124a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
124b0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
124c0 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
124d0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
124e0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
124f0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
12500 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12510 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12520 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  lHdr = 0;.  pPag
12530 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
12540 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
12550 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12560 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20  led whenever an 
12570 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72  IOERR or FULL er
12580 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65  ror that require
12590 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74  s.** the pager t
125a0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74  o transition int
125b0 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
125c0 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72  e may ahve occur
125d0 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  red..** The firs
125e0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
125f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
12600 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
12610 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74  the second .** t
12620 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
12630 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
12640 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
12650 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
12660 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
12670 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
12680 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12690 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
126a0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
126b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126c0 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55  ent is SQLITE_FU
126d0 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
126e0 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   or one of the.*
126f0 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65  * IOERR sub-code
12700 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  s, the pager ent
12710 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74  ers the ERROR st
12720 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ate and the erro
12730 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f  r code.** is sto
12740 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72  red in Pager.err
12750 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20  Code. While the 
12760 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e  pager remains in
12770 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12780 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41  ,.** all major A
12790 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  PI calls on the 
127a0 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
127b0 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61  iately return Pa
127c0 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a  ger.errCode..**.
127d0 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61  ** The ERROR sta
127e0 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  te indicates tha
127f0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
12800 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12810 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
12820 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
12830 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
12840 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
12850 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
12860 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12870 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
12880 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
12890 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
128a0 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
128b0 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
128c0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
128d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
128e0 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
128f0 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
12900 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
12910 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12920 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
12930 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
12940 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
12950 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
12960 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
12970 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
12980 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
12990 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
129a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
129b0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
129c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
129d0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
129e0 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
129f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12a00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
12a10 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
12a20 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
12a30 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
12a40 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12a50 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
12a60 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
12a70 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12a80 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
12a90 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12aa0 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  ER_ERROR;.  }.  
12ab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
12ac0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
12ad0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
12ae0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
12af0 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  e);../*.** This 
12b00 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
12b10 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
12b20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
12b30 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
12b40 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
12b50 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
12b60 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
12b70 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
12b80 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
12b90 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
12ba0 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
12bb0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12bc0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
12bd0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
12be0 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
12bf0 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
12c00 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
12c10 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
12c20 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
12c30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12c40 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
12c50 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
12c60 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
12c70 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
12c80 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
12c90 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
12ca0 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
12cb0 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
12cc0 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
12cd0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
12ce0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
12cf0 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
12d00 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
12d10 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
12d20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12d30 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
12d40 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
12d50 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
12d60 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
12d70 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
12d80 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
12d90 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
12da0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
12db0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
12dc0 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
12dd0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
12de0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
12df0 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
12e00 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
12e10 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
12e20 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
12e30 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
12e40 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
12e50 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
12e60 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e70 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12e80 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
12e90 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
12ea0 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
12eb0 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
12ec0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12ed0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
12ee0 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
12ef0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
12f00 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
12f10 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
12f20 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
12f30 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
12f40 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12f50 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
12f60 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12f70 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
12f80 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
12f90 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
12fa0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12fb0 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
12fc0 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
12fd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12fe0 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
12ff0 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
13000 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
13010 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
13020 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
13030 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
13040 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
13050 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
13060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
13070 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
13080 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
13090 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
130a0 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
130b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
130c0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
130d0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
130e0 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
130f0 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
13100 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13110 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
13120 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
13130 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
13140 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13150 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
13160 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
13170 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
13180 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
13190 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
131a0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
131b0 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
131c0 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
131d0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
131e0 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
131f0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
13200 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
13210 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
13220 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
13230 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
13240 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
13250 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
13260 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
13270 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
13280 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
13290 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
132a0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
132b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
132c0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
132d0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
132e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
132f0 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
13300 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
13310 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
13330 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
13340 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
13350 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
13360 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
13370 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
13380 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
13390 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
133a0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
133b0 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
133c0 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
133d0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
133e0 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
133f0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13400 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13410 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13420 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
13430 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
13440 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
13450 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
13460 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
13470 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
13480 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
13490 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
134a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
134b0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
134c0 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
134d0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
134e0 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
134f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13500 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
13510 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
13520 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13530 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
13540 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
13550 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
13560 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
13570 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
13580 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
13590 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
135a0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
135b0 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
135c0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
135d0 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
135e0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
135f0 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
13600 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
13610 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
13620 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
13630 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
13640 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
13650 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
13660 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
13670 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
13680 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
13690 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
136a0 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
136b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
136c0 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
136d0 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
136e0 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
136f0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13700 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
13710 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
13720 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
13730 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13740 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
13750 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
13760 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
13770 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
13780 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
13790 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
137a0 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
137b0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
137c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
137d0 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
137e0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
137f0 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
13800 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13810 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
13820 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
13830 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
13840 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
13850 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
13860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13870 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
13880 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
13890 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
138a0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
138b0 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
138c0 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
138d0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
138e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
138f0 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
13900 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
13910 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
13920 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13930 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
13940 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
13950 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13960 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
13970 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
13980 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
13990 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
139a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
139b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
139c0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
139d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
139e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
139f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13a00 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13a10 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
13a20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13a30 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
13a40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13a50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13a60 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13a70 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
13a80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
13a90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
13ab0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13ae0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
13af0 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
13b00 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13b10 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13b20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13b30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13b40 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13b50 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
13b60 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
13b70 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
13b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13b90 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
13ba0 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
13bb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
13bc0 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
13bd0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
13be0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13bf0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c10 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
13c20 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
13c30 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
13c40 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
13c50 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
13c60 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
13c70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
13c80 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
13c90 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
13ca0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
13cb0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13cc0 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
13cd0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
13ce0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
13cf0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
13d00 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
13d10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
13d20 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  rnal. .      */.
13d30 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74        int bDelet
13d40 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65  e = (!pPager->te
13d50 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65  mpFile && sqlite
13d60 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70  3JournalExists(p
13d70 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20  Pager->jfd));.  
13d80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13d90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13da0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13db0 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13dc0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13dd0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13de0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13df0 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13e00 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13e10 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13e20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13e30 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
13e40 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13e50 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13e60 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20      if( bDelete 
13e70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13e80 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13e90 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
13ea0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13eb0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13ec0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13ed0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13ee0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13ef0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
13f00 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
13f10 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
13f20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13f30 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
13f40 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13f50 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13f60 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
13f70 48 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c  Hdr *p = pager_l
13f80 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
13f90 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13fa0 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
13fb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13fc0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 29  te3PagerUnref(p)
13fd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13fe0 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
13ff0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
14000 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
14010 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
14020 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
14030 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
14040 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
14050 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
14060 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
14070 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
14080 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
14090 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
140a0 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
140b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
140c0 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
140d0 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
140e0 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
140f0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
14100 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
14110 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
14120 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
14130 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
14140 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
14150 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
14160 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
14170 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
14180 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
14190 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
141a0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
141b0 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
141c0 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
141d0 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
141e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
141f0 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67   bCommit && pPag
14200 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70  er->dbFileSize>p
14210 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
14220 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61  .    /* This bra
14230 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
14240 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
14250 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f  ransaction in ro
14260 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20  llback-journal. 
14270 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68     ** mode if th
14280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14290 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65  on disk is large
142a0 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
142b0 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
142c0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
142d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
142e0 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
142f0 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
14300 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  on .    ** succe
14310 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65  ssfully committe
14320 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55  d, but the EXCLU
14330 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69  SIVE lock is sti
14340 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  ll held on the. 
14350 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69     ** file. So i
14360 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75  t is safe to tru
14370 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
14380 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d  se file to its m
14390 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65  inimum.    ** re
143a0 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f  quired size.  */
143b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
143c0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
143d0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
143e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
143f0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
14400 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
14410 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
14420 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14430 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55   .   && (!pagerU
14440 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  seWal(pPager) ||
14450 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
14460 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
14470 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a  >pWal, 0)).  ){.
14480 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55      rc2 = pagerU
14490 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
144a0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
144b0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
144c0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
144d0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74   }.  pPager->eSt
144e0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
144f0 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  ER;.  pPager->se
14500 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  tMaster = 0;..  
14510 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
14520 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
14530 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
14540 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
14550 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
14560 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
14570 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
14580 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  e file. .**.** I
14590 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
145a0 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
145b0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
145c0 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
145d0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
145e0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49   at this time. I
145f0 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e  nstead, pager_un
14600 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  lock() is called
14610 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  . The.** call to
14620 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
14630 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c  will discard all
14640 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
14650 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20  , unlock.** the 
14660 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
14670 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  d move the pager
14680 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
14690 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a  ate. If this .**
146a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72   means that ther
146b0 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
146c0 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
146d0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
146e0 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74  next .** connect
146f0 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ion to obtain a 
14700 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
14710 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
14720 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
14730 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69   .** will roll i
14740 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
14750 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e   the pager has n
14760 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  ot already enter
14770 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
14780 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72  te, but an IO or
14790 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  .** malloc error
147a0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
147b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
147c0 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66  this will itself
147d0 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70   cause .** the p
147e0 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
147f0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57  e ERROR state. W
14800 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65  hich will be cle
14810 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  ared by the.** c
14820 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
14830 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69  ock(), as descri
14840 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  bed above..*/.st
14850 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
14860 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
14870 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14880 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
14890 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
148a0 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OR && pPager->eS
148b0 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
148c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
148d0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
148e0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
148f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
14900 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
14910 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
14920 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
14930 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14940 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14950 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14960 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14970 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
14980 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
14990 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
149a0 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
149b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
149c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
149d0 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70  EADER );.      p
149e0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
149f0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20  tion(pPager, 0, 
14a00 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
14a10 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
14a20 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ger);.}../*.** P
14a30 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d  arameter aData m
14a40 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
14a50 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d  uffer of pPager-
14a60 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a  >pageSize bytes.
14a70 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70  ** of data. Comp
14a80 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
14a90 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   checksum based 
14aa0 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ont the contents
14ab0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
14ac0 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65   of data and the
14ad0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
14ae0 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f pPager->cksumI
14af0 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nit..**.** This 
14b00 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
14b10 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65  ecksum. It is re
14b20 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
14b30 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
14b40 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
14b50 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  e (pPager->cksum
14b60 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20  Init) and every 
14b70 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66  200th byte.** of
14b80 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20   the page data, 
14b90 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79  starting with by
14ba0 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65  te offset (pPage
14bb0 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29  r->pageSize%200)
14bc0 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69  ..** Each byte i
14bd0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
14be0 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e   an 8-bit unsign
14bf0 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  ed integer..**.*
14c00 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66  * Changing the f
14c10 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63  ormula used to c
14c20 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63  ompute this chec
14c30 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20  ksum results in 
14c40 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62  an.** incompatib
14c50 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  le journal file 
14c60 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
14c70 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
14c80 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
14c90 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
14ca0 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
14cb0 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20  ly .** scenario 
14cc0 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
14cd0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
14ce0 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
14cf0 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20  be changed. .** 
14d00 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20  It is much less 
14d10 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
14d20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
14d30 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
14d40 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
14d50 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
14d60 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
14d70 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
14d80 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
14d90 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
14da0 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
14db0 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
14dc0 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
14dd0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ion..*/.static u
14de0 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
14df0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
14e00 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
14e10 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
14e20 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
14e30 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
14e40 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65  ksum value to re
14e50 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20  turn */.  int i 
14e60 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
14e70 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20  ze-200;         
14e80 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14e90 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30   */.  while( i>0
14ea0 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
14eb0 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
14ec0 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
14ed0 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
14ee0 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  /*.** Report the
14ef0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69   current page si
14f00 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ze and number of
14f10 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
14f20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63  back.** to the c
14f30 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  odec..*/.#ifdef 
14f40 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
14f50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
14f60 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67  erReportSize(Pag
14f70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14f80 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
14f90 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20  cSizeChng ){.   
14fa0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
14fb0 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e  izeChng(pPager->
14fc0 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e  pCodec, pPager->
14fd0 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72       (int)pPager
15000 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d  ->nReserve);.  }
15010 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
15020 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  e pagerReportSiz
15030 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  e(X)     /* No-o
15040 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73  p if we do not s
15050 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a  upport a codec *
15060 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
15070 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
15080 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
15090 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
150a0 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
150b0 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
150c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
150d0 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
150e0 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
150f0 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
15100 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
15110 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
15120 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
15130 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
15140 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
15150 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
15160 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
15170 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
15180 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f  *.** The main ro
15190 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
151a0 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  ses checksums - 
151b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
151c0 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e  urnal does .** n
151d0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
151e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
151f0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
15200 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
15210 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15220 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
15230 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
15240 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
15250 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
15260 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
15270 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
15280 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
15290 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
152a0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
152b0 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
152c0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
152d0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
152e0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
152f0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
15300 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
15310 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
15320 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
15330 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
15340 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
15350 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
15360 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
15370 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
15380 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
15390 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
153a0 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
153b0 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
153c0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
153d0 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
153e0 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
153f0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15400 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15410 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
15420 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
15430 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
15440 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
15450 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
15460 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
15470 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15480 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
15490 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
154a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
154b0 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
154c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
154d0 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
154e0 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
154f0 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
15500 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15510 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
15520 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
15530 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
15540 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
15550 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
15560 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
15570 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
15580 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
15590 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
155a0 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
155b0 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
155c0 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
155d0 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
155e0 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
155f0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
15600 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
15610 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
15620 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
15630 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
15640 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
15650 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
15660 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
15670 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
15680 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
15690 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
156a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
156b0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
156c0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
156d0 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
156e0 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
156f0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
15700 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
15710 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
15720 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
15730 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
15740 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
15750 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
15760 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
15770 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
15780 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157a0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
157b0 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
157c0 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
157d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
157e0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
157f0 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
15800 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
15810 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
15820 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
15830 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
15840 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
15850 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15870 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
15880 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
15890 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
158a0 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
158b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
158c0 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
158d0 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
158e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
158f0 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
15900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
15910 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
15920 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
15930 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15950 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
15960 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
15970 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
15980 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
15990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
159a0 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
159b0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
159c0 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
159f0 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
15a00 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
15a10 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
15a20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
15a30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
15a40 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
15a50 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
15a60 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
15a70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15a80 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
15a90 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73   synced */..  as
15aa0 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
15ab0 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
15ac0 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
15ad0 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
15ae0 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
15af0 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
15b00 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
15b10 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
15b20 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
15b30 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
15b40 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
15b50 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
15b60 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
15b70 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
15b80 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
15b90 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
15ba0 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
15bb0 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
15bc0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
15bd0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
15be0 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
15bf0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
15c00 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
15c10 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
15c20 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
15c30 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
15c40 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
15c50 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
15c60 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72   );..  /* Either
15c70 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72   the state is gr
15c80 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52  eater than PAGER
15c90 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15ca0 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   (a transaction 
15cb0 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69  .  ** or savepoi
15cc0 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65  nt rollback done
15cd0 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20   at the request 
15ce0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f  of the caller) o
15cf0 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61  r this is.  ** a
15d00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
15d10 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20  lback. If it is 
15d20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15d30 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65  llback, the page
15d40 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61  r.  ** is in sta
15d50 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64  te OPEN and hold
15d60 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
15d70 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c  ock. Hot-journal
15d80 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f   rollback.  ** o
15d90 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74  nly reads from t
15da0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  he main journal,
15db0 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75   not the sub-jou
15dc0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
15dd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
15de0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
15df0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
15e00 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53    || (pPager->eS
15e10 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
15e20 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
15e30 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
15e40 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  K).  );.  assert
15e50 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15e60 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
15e70 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69  ACHEMOD || isMai
15e80 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52  nJrnl );..  /* R
15e90 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
15ea0 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74  ber and page dat
15eb0 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  a from the journ
15ec0 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
15ed0 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74  l.  ** file. Ret
15ee0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
15ef0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  e to the caller 
15f00 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
15f10 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66  ccurs..  */.  jf
15f20 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f  d = isMainJrnl ?
15f30 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
15f40 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72  Pager->sjfd;.  r
15f50 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
15f60 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70  fd, *pOffset, &p
15f70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
15f80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
15f90 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
15fa0 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
15fb0 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
15fc0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
15fd0 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
15fe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15ff0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
16000 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
16010 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
16020 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
16030 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
16040 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
16050 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
16060 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
16070 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
16080 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
16090 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
160a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
160b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
160c0 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
160d0 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
160e0 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
160f0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
16100 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
16110 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
16120 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
16130 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
16140 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
16150 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
16160 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
16170 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
16180 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
16190 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
161a0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
161b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
161c0 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
161d0 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
161e0 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
161f0 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
16200 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
16210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16220 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
16230 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
16240 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
16250 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
16260 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
16270 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
16280 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
16290 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
162a0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
162b0 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  8*)aData)!=cksum
162c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
162d0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
162e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
162f0 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61   this page has a
16300 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
16310 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75 72  ed by before dur
16320 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
16330 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
16340 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
16350 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
16360 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
16370 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
16380 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
16390 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
163a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
163b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
163c0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
163d0 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
163e0 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
163f0 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
16400 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
16410 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
16420 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
16430 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
16440 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
16450 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
16460 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
16470 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
16480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16490 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41  e pager is in CA
164a0 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68  CHEMOD state, th
164b0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
164c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
164d0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
164e0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
164f0 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
16500 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
16510 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
16520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16530 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
16540 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
16550 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
16560 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
16570 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
16580 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
16590 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
165a0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
165b0 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
165c0 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
165d0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
165e0 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
165f0 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
16600 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
16610 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
16620 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
16630 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
16640 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
16650 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
16660 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
16670 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
16680 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
16690 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
166a0 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
166b0 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
166c0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
166d0 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
166e0 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45    ** If in WRITE
166f0 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f  R_DBMOD, WRITER_
16700 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e  FINISHED or OPEN
16710 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
16720 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  update the.  ** 
16730 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
16740 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  t exists and the
16750 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
16760 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
16770 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69  ked .  ** not di
16780 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20  rty. Since this 
16790 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65  code is only exe
167a0 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f  cuted in PAGER_O
167b0 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20  PEN state for.  
167c0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
167d0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
167e0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
167f0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
16800 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66  is empty.  ** if
16810 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
16820 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a   OPEN state..  *
16830 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
16840 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
16850 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
16860 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
16870 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
16880 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
16890 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
168a0 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
168b0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
168c0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
168d0 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
168e0 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
168f0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
16900 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
16910 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
16920 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
16930 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
16940 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
16950 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
16960 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
16970 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
16980 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
16990 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
169a0 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
169b0 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
169c0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
169d0 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
169e0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
169f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
16a00 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
16a10 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
16a20 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
16a30 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
16a40 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
16a50 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
16a60 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
16a70 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
16a80 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
16a90 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
16aa0 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
16ab0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
16ac0 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
16ad0 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
16ae0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16af0 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
16b00 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
16b10 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
16b20 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
16b30 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
16b40 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
16b50 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
16b60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
16b70 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
16b80 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16b90 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
16ba0 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
16bb0 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
16bc0 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
16bd0 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
16be0 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
16bf0 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
16c00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
16c10 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
16c20 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
16c30 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
16c40 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
16c50 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
16c60 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
16c70 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
16c80 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
16c90 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
16ca0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
16cb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
16cc0 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
16cd0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16ce0 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
16cf0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
16d00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
16d10 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
16d20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16d30 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
16d40 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20  _OPEN || pPg==0 
16d50 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
16d60 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
16d70 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
16d80 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
16d90 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
16da0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
16db0 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
16dc0 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29  >pageSize, (u8*)
16dd0 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20  aData),.        
16de0 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
16df0 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
16e00 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
16e10 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  );.  if( isMainJ
16e20 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e  rnl ){.    isSyn
16e30 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ced = pPager->no
16e40 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65  Sync || (*pOffse
16e50 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t <= pPager->jou
16e60 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73  rnalHdr);.  }els
16e70 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  e{.    isSynced 
16e80 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  = (pPg==0 || 0==
16e90 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
16ea0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b  HDR_NEED_SYNC));
16eb0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65  .  }.  if( isOpe
16ec0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
16ed0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
16ee0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
16ef0 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
16f00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
16f10 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53  _OPEN).   && isS
16f20 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69  ynced.  ){.    i
16f30 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
16f40 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
16f50 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65  pageSize;.    te
16f60 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70  stcase( !isSavep
16f70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20  nt && pPg!=0 && 
16f80 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
16f90 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
16fa0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
16fb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
16fc0 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
16fd0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
16fe0 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a  Pager->fd, (u8 *
16ff0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
17000 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
17010 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
17020 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
17030 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17040 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
17050 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
17060 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
17070 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
17080 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
17090 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
170a0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
170b0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
170c0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
170d0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
170e0 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
170f0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
17100 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
17110 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
17120 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
17130 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
17140 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
17150 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
17160 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
17170 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17180 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
17190 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
171a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
171b0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
171c0 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
171d0 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
171e0 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
171f0 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
17200 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
17210 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
17220 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
17230 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
17240 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
17250 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
17260 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
17270 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
17280 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17290 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
172a0 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
172b0 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
172c0 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
172d0 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
172e0 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
172f0 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
17300 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
17310 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
17320 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
17330 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
17340 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
17350 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
17360 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
17370 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
17380 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
17390 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
173a0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
173b0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
173c0 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
173d0 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
173e0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
173f0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
17400 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
17410 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
17420 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
17430 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
17440 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
17450 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
17460 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
17470 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
17480 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
17490 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
174a0 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
174b0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
174c0 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
174d0 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
174e0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
174f0 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
17500 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17510 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
17520 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
17530 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
17540 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
17550 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17560 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
17570 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
17580 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
17590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
175a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
175b0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
175c0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
175d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
175e0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
175f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
17600 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
17610 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
17620 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
17630 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
17640 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
17650 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
17660 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
17670 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
17680 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
17690 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
176a0 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
176b0 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
176c0 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
176d0 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
176e0 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
176f0 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
17700 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
17710 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
17720 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
17730 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
17740 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
17750 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
17760 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
17770 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
17780 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
17790 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
177a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
177b0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
177c0 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
177d0 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
177e0 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
177f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
17800 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17810 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17820 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
17830 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
17840 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
17850 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
17860 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
17870 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
17880 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
17890 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
178a0 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
178b0 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
178c0 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
178d0 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
178e0 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
178f0 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
17900 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
17910 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
17920 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17930 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
17940 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
17950 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
17960 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
17970 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
17980 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
17990 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
179a0 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
179b0 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
179c0 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
179d0 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
179e0 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
179f0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
17a00 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
17a10 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
17a20 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17a30 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
17a40 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
17a50 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
17a60 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
17a70 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
17a80 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
17a90 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
17aa0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
17ab0 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
17ac0 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
17ad0 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
17ae0 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
17af0 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17b00 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
17b10 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
17b20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
17b30 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
17b40 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
17b50 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
17b60 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
17b70 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
17b80 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
17b90 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
17ba0 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
17bb0 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
17bc0 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
17bd0 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
17be0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17bf0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
17c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
17c10 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
17c20 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
17c30 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
17c40 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
17c50 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
17c60 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
17c70 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
17c80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
17c90 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
17ca0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
17cb0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17cc0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
17cd0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
17ce0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
17cf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
17d00 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
17d10 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
17d20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
17d30 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
17d40 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
17d50 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
17d60 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
17d70 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
17d80 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
17d90 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
17da0 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
17db0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
17dc0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
17dd0 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
17de0 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
17df0 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
17e00 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
17e10 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17e20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
17e30 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
17e40 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
17e50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
17e60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
17e70 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
17e80 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
17e90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17ea0 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
17eb0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
17ec0 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
17ed0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17ee0 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
17ef0 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
17f00 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
17f10 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
17f20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
17f30 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
17f40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
17f50 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
17f60 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
17f70 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
17f80 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
17f90 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
17fa0 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
17fb0 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
17fc0 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
17fd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
17fe0 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
17ff0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18000 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
18010 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
18020 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
18030 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
18040 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
18050 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
18060 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
18070 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
18080 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
18090 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
180a0 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
180b0 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
180c0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
180d0 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
180e0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
180f0 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
18100 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
18110 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
18120 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
18130 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
18140 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
18150 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
18160 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
18170 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
18180 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
18190 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
181a0 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
181b0 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
181c0 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
181d0 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
181e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
181f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18200 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
18210 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
18220 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
18230 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
18240 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
18250 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
18260 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
18270 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
18280 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
18290 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
182a0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
182b0 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
182c0 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
182d0 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
182e0 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
182f0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18300 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
18310 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
18320 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
18330 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
18340 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
18350 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
18360 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
18370 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
18380 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
18390 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
183a0 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
183b0 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
183c0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
183d0 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
183e0 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
183f0 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
18400 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
18410 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
18420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
18430 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
18440 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
18450 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18460 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
18470 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
18480 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
18490 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
184a0 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
184b0 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
184c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
184d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
184e0 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
184f0 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
18500 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
18510 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18520 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
18530 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
18540 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
18550 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
18560 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
18570 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
18580 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18590 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
185a0 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
185b0 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
185c0 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
185d0 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
185e0 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
185f0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
18600 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
18610 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
18630 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
18640 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
18650 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
18660 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18670 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18680 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
18690 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
186a0 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
186b0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
186c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
186d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
186e0 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
186f0 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
18700 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18710 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
18720 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
18730 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
18740 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
18750 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18760 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
18770 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
18780 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
18790 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
187a0 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
187b0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
187c0 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
187d0 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
187e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
187f0 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18800 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
18810 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
18820 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
18830 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
18840 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
18850 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
18860 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
18870 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
18880 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
18890 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
188a0 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
188b0 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
188c0 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
188d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
188e0 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
188f0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
18900 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
18910 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
18920 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
18930 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
18940 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
18950 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
18960 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
18970 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
18980 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
18990 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
189a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
189b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
189c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
189d0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
189e0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
189f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
18a00 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
18a10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18a20 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
18a30 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
18a40 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
18a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18a60 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18a70 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
18a80 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
18a90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
18aa0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
18ab0 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
18ac0 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
18ad0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
18ae0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
18af0 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
18b00 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
18b10 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
18b20 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
18b30 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
18b40 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
18b50 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
18b60 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
18b70 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
18b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18b90 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
18ba0 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
18bb0 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
18bc0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18bd0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18be0 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
18bf0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
18c00 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
18c10 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
18c20 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
18c30 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
18c40 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
18c50 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
18c60 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18c70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
18c80 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18c90 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
18ca0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
18cb0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
18cc0 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
18cd0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
18ce0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
18cf0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
18d00 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
18d10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18d20 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18d30 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
18d40 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
18d50 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
18d60 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
18d70 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
18d80 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
18d90 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
18da0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
18db0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
18dc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18dd0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
18de0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
18df0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
18e00 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
18e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18e20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
18e30 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18e40 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
18e50 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
18e60 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
18e70 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
18e80 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18e90 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
18ea0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
18eb0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
18ec0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
18ed0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
18ee0 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
18ef0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
18f00 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
18f10 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
18f20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
18f30 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
18f40 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
18f50 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18f60 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
18f70 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
18f80 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18f90 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
18fa0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
18fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18fd0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18fe0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18ff0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
19000 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
19010 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
19020 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
19030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
19040 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
19050 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19070 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19080 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19090 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
190a0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
190b0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
190c0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
190d0 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
190e0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
190f0 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
19100 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
19110 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19120 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
19130 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19150 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
19160 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19170 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
19180 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
19190 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
191a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
191b0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
191c0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
191d0 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
191e0 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
191f0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
19200 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
19210 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19220 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
19230 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
19240 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
19250 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
19260 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19270 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
19280 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
19290 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
192a0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
192b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
192c0 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
192d0 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
192e0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
192f0 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
19300 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
19310 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
19320 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
19330 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
19340 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
19350 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
19360 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
19370 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
19380 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
19390 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
193a0 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
193b0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
193c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
193d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
193e0 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
193f0 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
19400 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
19410 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
19420 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
19430 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19440 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
19450 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
19460 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
19470 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
19480 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
19490 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
194a0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
194b0 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
194c0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
194d0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
194e0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
194f0 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
19500 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
19510 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
19520 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
19530 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
19540 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
19550 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
19560 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
19570 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
19580 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
19590 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
195a0 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
195b0 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
195c0 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
195d0 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
195e0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
195f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
19600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
19610 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
19620 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
19630 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
19640 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
19650 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
19660 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
19670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19680 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
19690 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
196a0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
196b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
196c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
196d0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
196e0 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
196f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19700 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
19710 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
19720 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
19730 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
19740 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
19750 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
19760 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
19770 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
19780 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
19790 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
197a0 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
197b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
197c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
197d0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
197e0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
197f0 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19800 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19810 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19820 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
19830 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19840 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
19850 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
19860 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
19870 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
19880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19890 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
198a0 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
198b0 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
198c0 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
198d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
198e0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
198f0 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19900 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
19910 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
19920 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
19930 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
19940 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
19950 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
19960 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
19970 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
19980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19990 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
199a0 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
199b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
199c0 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
199d0 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
199e0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
199f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19a00 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
19a10 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
19a20 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
19a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19a50 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
19a60 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
19a70 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
19a80 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19a90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19aa0 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64  turn a sanitized
19ab0 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
19ac0 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f  sector-size of O
19ad0 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68  S file pFile. Th
19ae0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
19af0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
19b00 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33  to lie between 3
19b10 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52  2 and MAX_SECTOR
19b20 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _SIZE..*/.int sq
19b30 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
19b40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
19b50 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74  ile){.  int iRet
19b60 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
19b70 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20  orSize(pFile);. 
19b80 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a   if( iRet<32 ){.
19b90 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a      iRet = 512;.
19ba0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74    }else if( iRet
19bb0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
19bc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19bd0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
19be0 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74  =512 );.    iRet
19bf0 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
19c00 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
19c10 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iRet;.}../*.** 
19c20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
19c30 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
19c40 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
19c50 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
19c60 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
19c70 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
19c80 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
19c90 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
19ca0 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
19cb0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
19cc0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
19cd0 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
19ce0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
19cf0 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
19d00 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
19d10 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
19d20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
19d30 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
19d40 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
19d50 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
19d60 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
19d70 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
19d80 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
19d90 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
19da0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
19db0 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
19dc0 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
19dd0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
19de0 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
19df0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
19e00 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
19e10 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
19e20 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
19e30 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
19e40 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
19e50 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
19e60 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
19e70 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
19e80 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a  _SECTOR_SIZE..**
19e90 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19ea0 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49  has the SQLITE_I
19eb0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
19ec0 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74  VERWRITE propert
19ed0 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74  y, then set.** t
19ee0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
19ef0 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20  tor size to its 
19f00 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35  minimum value (5
19f10 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73  12).  The purpos
19f20 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  e of.** pPager->
19f30 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f  sectorSize is to
19f40 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61   define the "bla
19f50 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79  st radius" of by
19f60 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  tes that.** migh
19f70 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72  t change if a cr
19f80 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ash occurs while
19f90 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69   writing to a si
19fa0 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20  ngle byte in.** 
19fb0 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74  that range.  But
19fc0 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f   with POWERSAFE_
19fd0 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62  OVERWRITE, the b
19fe0 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a  last radius is z
19ff0 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20  ero.** (that is 
1a000 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f  what POWERSAFE_O
1a010 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c  VERWRITE means),
1a020 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20   so we minimize 
1a030 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69  the sector.** si
1a040 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72  ze.  For backwar
1a050 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
1a060 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1a070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1a080 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e  rmat,.** we cann
1a090 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66  ot reduce the ef
1a0a0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a0b0 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a  ize below 512..*
1a0c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1a0d0 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
1a0e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
1a0f0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1a100 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1a110 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a120 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
1a130 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73  empFile.   || (s
1a140 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1a150 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1a160 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20  ager->fd) & .   
1a170 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1a180 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1a190 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a  E_OVERWRITE)!=0.
1a1a0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74    ){.    /* Sect
1a1b0 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
1a1c0 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
1a1d0 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
1a1e0 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
1a1f0 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
1a200 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
1a210 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
1a220 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
1a230 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
1a240 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20  l segfault. */. 
1a250 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1a260 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
1a270 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
1a280 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
1a290 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1a2a0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1a2b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
1a2c0 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
1a2d0 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
1a2e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a2f0 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
1a300 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
1a310 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
1a320 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
1a330 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
1a340 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
1a350 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
1a360 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
1a370 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
1a380 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
1a390 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
1a3a0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1a3b0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1a3c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a3d0 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
1a3e0 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
1a3f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
1a400 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
1a410 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
1a420 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
1a430 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
1a440 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
1a450 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
1a460 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
1a470 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a480 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a490 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
1a4a0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
1a4b0 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
1a4c0 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
1a4d0 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
1a4e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a4f0 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
1a500 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
1a510 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
1a520 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
1a530 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
1a540 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1a550 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1a560 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
1a570 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
1a580 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
1a590 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1a5a0 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
1a5b0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1a5c0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
1a5d0 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
1a5e0 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
1a5f0 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
1a600 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
1a610 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
1a620 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
1a630 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
1a640 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
1a650 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
1a660 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
1a670 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1a680 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
1a690 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
1a6a0 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
1a6b0 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
1a6c0 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
1a6d0 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
1a6e0 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
1a6f0 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
1a700 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
1a710 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
1a720 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
1a730 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
1a740 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
1a750 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
1a760 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
1a770 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
1a780 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
1a790 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1a7a0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
1a7b0 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
1a7c0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1a7d0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
1a7e0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
1a7f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1a800 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
1a810 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
1a820 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
1a830 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1a840 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
1a850 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
1a860 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
1a870 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1a880 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
1a890 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
1a8a0 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
1a8b0 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
1a8c0 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
1a8d0 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
1a8e0 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
1a8f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1a900 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
1a910 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
1a920 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
1a930 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
1a940 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
1a950 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
1a960 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
1a970 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1a980 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
1a990 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
1a9a0 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
1a9b0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
1a9c0 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
1a9d0 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
1a9e0 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
1a9f0 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
1aa00 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
1aa10 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
1aa20 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
1aa30 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
1aa40 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
1aa50 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
1aa60 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
1aa70 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
1aa80 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
1aa90 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
1aaa0 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
1aab0 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
1aac0 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
1aad0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1aae0 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
1aaf0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1ab00 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1ab10 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1ab20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
1ab30 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
1ab40 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
1ab50 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1ab60 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
1ab70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1ab80 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
1ab90 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
1aba0 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
1abb0 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
1abc0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
1abd0 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
1abe0 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
1abf0 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
1ac00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
1ac10 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
1ac20 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
1ac30 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
1ac40 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
1ac50 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1ac60 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1ac70 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
1ac80 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1ac90 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
1aca0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1acb0 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
1acc0 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
1acd0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
1ace0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
1acf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
1ad00 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
1ad10 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
1ad20 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
1ad30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1ad40 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
1ad50 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
1ad60 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
1ad70 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
1ad80 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
1ad90 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
1ada0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
1adb0 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
1adc0 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
1add0 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
1ade0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1adf0 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
1ae00 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
1ae10 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1ae20 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1ae30 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
1ae40 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1ae50 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1ae60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1ae70 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1ae80 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1ae90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1aea0 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
1aeb0 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1aec0 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
1aed0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1aee0 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1aef0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
1af00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1af10 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
1af20 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
1af30 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
1af40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1af50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1af60 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
1af70 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
1af80 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1af90 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1afa0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
1afb0 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
1afc0 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
1afd0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1afe0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1aff0 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
1b000 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
1b010 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
1b020 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
1b030 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
1b040 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ge rollback */. 
1b050 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d   int nPlayback =
1b060 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74   0;       /* Tot
1b070 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1b080 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  es restored from
1b090 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f   journal */..  /
1b0a0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1b0b0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1b0c0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1b0d0 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1b0e0 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1b0f0 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1b100 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1b110 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1b120 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b130 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1b140 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1b150 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b160 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1b170 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b180 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1b190 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b1a0 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1b1b0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1b1c0 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1b1d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b1e0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1b1f0 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1b200 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1b210 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1b220 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1b230 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1b240 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1b250 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1b260 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1b270 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1b280 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1b290 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1b2a0 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1b2b0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1b2c0 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1b2d0 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1b2e0 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1b2f0 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1b300 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1b310 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1b320 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1b330 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1b340 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1b350 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1b360 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1b370 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1b380 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1b390 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1b3a0 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1b3b0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1b3c0 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1b3d0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1b3e0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1b3f0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1b400 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1b410 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1b420 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1b430 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1b440 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1b450 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1b460 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1b470 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1b480 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1b490 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1b4a0 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1b4b0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1b4c0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1b4d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b4e0 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1b4f0 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1b500 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1b510 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1b520 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1b530 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1b540 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1b550 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1b560 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1b570 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1b580 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1b590 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1b5a0 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1b5b0 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1b5c0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1b5d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b5e0 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1b5f0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1b600 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1b610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b620 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1b630 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1b640 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1b650 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1b660 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1b670 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1b680 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1b690 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1b6a0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1b6b0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1b6c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1b6d0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1b6e0 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1b6f0 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1b700 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1b710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1b720 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b730 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1b740 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b750 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1b760 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b770 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1b780 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1b790 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1b7a0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1b7b0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1b7c0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1b7d0 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1b7e0 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1b7f0 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1b800 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1b810 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1b820 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1b830 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1b840 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1b850 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1b860 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1b870 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1b880 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1b890 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1b8a0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1b8b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b8c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1b8d0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b8e0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1b8f0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1b900 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1b910 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1b920 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1b930 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b940 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1b950 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1b960 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1b970 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1b980 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1b990 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1b9a0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1b9b0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1b9c0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1b9d0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1b9e0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1b9f0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1ba00 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1ba10 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1ba20 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1ba30 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1ba40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1ba50 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1ba60 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1ba70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1ba80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1ba90 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1baa0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1bab0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1bac0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1bad0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1bae0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1baf0 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1bb00 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1bb10 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1bb20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1bb30 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1bb40 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1bb50 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1bb60 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1bb70 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1bb80 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1bb90 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1bba0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1bbb0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1bbc0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1bbd0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1bbe0 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1bbf0 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1bc00 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1bc10 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1bc20 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1bc30 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1bc40 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1bc50 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1bc60 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1bc70 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1bc80 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1bc90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1bca0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1bcb0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1bcc0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1bcd0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1bce0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1bcf0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bd00 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1bd10 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1bd20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1bd30 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1bd40 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1bd50 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1bd60 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1bd70 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1bd80 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1bd90 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1bda0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1bdb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1bdc0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1bdd0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1bde0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1bdf0 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1be00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1be10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1be20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1be30 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1be40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1be50 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1be60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1be70 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1be80 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1be90 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1bea0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1beb0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1bec0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1bed0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1bee0 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1bef0 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1bf00 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1bf10 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1bf20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1bf30 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1bf40 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1bf50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1bf60 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1bf70 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1bf80 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1bf90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1bfa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bfb0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b        nPlayback+
1bfc0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
1bfd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1bfe0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1bff0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c000 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1c010 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1c020 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1c030 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1c040 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c050 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1c060 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c070 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1c080 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1c090 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1c0a0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1c0b0 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1c0c0 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1c0d0 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1c0e0 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1c0f0 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1c100 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1c110 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1c120 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1c130 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1c140 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1c150 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1c160 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1c170 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1c180 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1c190 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1c1a0 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1c1b0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1c1c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1c1d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1c1e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c1f0 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1c200 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1c210 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1c220 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1c230 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1c240 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1c250 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1c260 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1c270 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1c280 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1c290 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1c2a0 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1c2b0 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1c2c0 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1c2d0 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1c2e0 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1c2f0 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1c300 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1c310 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1c320 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1c330 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1c340 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1c350 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c360 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1c370 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1c380 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1c390 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1c3a0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1c3b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c3c0 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1c3d0 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1c3e0 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1c3f0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1c400 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1c410 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1c420 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1c430 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1c440 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1c450 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1c460 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1c470 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1c480 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1c490 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1c4a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1c4b0 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67  DEBUG.  if( pPag
1c4c0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1c4d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
1c4e0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
1c4f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
1c500 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1c510 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65  ANGED,0);.  }.#e
1c520 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1c530 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1c540 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1c550 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1c560 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1c570 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1c580 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1c590 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1c5a0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1c5b0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1c5c0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1c5d0 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1c5e0 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1c5f0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1c600 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1c610 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1c620 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1c630 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1c640 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1c650 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1c660 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1c670 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1c680 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1c690 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1c6a0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1c6b0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1c6c0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1c6d0 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1c6e0 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1c6f0 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1c700 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1c710 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1c720 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1c730 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1c740 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1c750 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1c760 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1c770 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1c780 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1c790 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1c7a0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1c7b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1c7c0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1c7d0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1c7e0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1c7f0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1c800 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1c810 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1c820 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1c830 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1c840 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1c850 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c860 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1c870 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1c880 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1c890 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1c8a0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1c8b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c8c0 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 29  agerSync(pPager)
1c8d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1c8e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c8f0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1c900 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1c910 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1c920 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1c930 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1c940 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1c950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c960 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1c970 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1c980 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1c990 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1c9a0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1c9b0 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1c9c0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1c9d0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1c9e0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1c9f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1ca00 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1ca10 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1ca20 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1ca30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1ca40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1ca50 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1ca60 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1ca70 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1ca80 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1ca90 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1caa0 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1cab0 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1cad0 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1cae0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1caf0 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1cb00 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1cb10 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1cb20 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1cb30 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1cb40 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1cb50 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1cb60 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1cb70 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1cb80 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1cb90 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1cba0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1cbb0 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1cbc0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1cbd0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1cbe0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1cbf0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1cc00 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1cc10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1cc20 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
1cc30 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
1cc40 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
1cc50 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
1cc60 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1cc70 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
1cc80 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1cc90 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1cca0 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
1ccb0 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
1ccc0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
1ccd0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
1cce0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
1ccf0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1cd00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1cd10 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
1cd20 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1cd30 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
1cd40 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1cd50 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
1cd60 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1cd70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1cd80 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1cd90 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
1cda0 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a  g, u32 iFrame){.
1cdb0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1cdc0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1cdd0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1cde0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1cdf0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
1ce00 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
1ce10 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
1ce20 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
1ce30 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1ce40 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1ce50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1ce60 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1ce70 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1ce80 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1ce90 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1cea0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1ceb0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1cec0 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1ced0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1cee0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1cef0 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
1cf00 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
1cf10 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
1cf20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cf30 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1cf40 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
1cf50 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
1cf60 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
1cf70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1cf80 20 7d 0a 0a 20 20 69 66 28 20 69 46 72 61 6d 65   }..  if( iFrame
1cf90 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74   ){.    /* Try t
1cfa0 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20  o pull the page 
1cfb0 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61  from the write-a
1cfc0 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20  head log. */.   
1cfd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1cfe0 52 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72  ReadFrame(pPager
1cff0 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20  ->pWal, iFrame, 
1d000 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
1d010 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d020 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70  i64 iOffset = (p
1d030 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
1d040 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
1d050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1d060 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
1d070 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73   pPg->pData, pgs
1d080 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  z, iOffset);.   
1d090 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d0a0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1d0b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1d0c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1d0d0 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d    }..  if( pgno=
1d0e0 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  =1 ){.    if( rc
1d0f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1d100 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75  the read is unsu
1d110 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1d120 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74  e dbFileVers[] t
1d130 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20  o something.    
1d140 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e    ** that will n
1d150 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20  ever be a valid 
1d160 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64  file version.  d
1d170 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61  bFileVers[] is a
1d180 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f   copy.      ** o
1d190 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f  f bytes 24..39 o
1d1a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
1d1b0 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68   Bytes 28..31 sh
1d1c0 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20  ould always be. 
1d1d0 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20       ** zero or 
1d1e0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1d1f0 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
1d200 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61  . Bytes 32..35 a
1d210 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20  nd 35..39.      
1d220 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67  ** should be pag
1d230 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20  e numbers which 
1d240 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66  are never 0xffff
1d250 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e  ffff.  So fillin
1d260 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65  g.      ** pPage
1d270 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  r->dbFileVers[] 
1d280 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79  with all 0xff by
1d290 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69  tes should suffi
1d2a0 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ce..      **.   
1d2b0 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63     ** For an enc
1d2c0 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c  rypted database,
1d2d0 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69   the situation i
1d2e0 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20  s more complex: 
1d2f0 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20   bytes.      ** 
1d300 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61  24..39 of the da
1d310 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65  tabase are white
1d320 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65   noise.  But the
1d330 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a   probability of.
1d340 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e        ** white n
1d350 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20  oising equaling 
1d360 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66  16 bytes of 0xff
1d370 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20   is vanishingly 
1d380 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a  small so.      *
1d390 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c  * we should stil
1d3a0 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a  l be ok..      *
1d3b0 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  /.      memset(p
1d3c0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d3d0 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28  s, 0xff, sizeof(
1d3e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d3f0 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rs));.    }else{
1d400 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c  .      u8 *dbFil
1d410 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70  eVers = &((u8*)p
1d420 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a  Pg->pData)[24];.
1d430 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1d440 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d450 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
1d460 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1d470 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1d480 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1d490 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
1d4a0 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20  , pgno, 3, rc = 
1d4b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a  SQLITE_NOMEM);..
1d4c0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1d4d0 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
1d4e0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
1d4f0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1d500 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
1d510 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
1d520 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1d530 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
1d540 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
1d550 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1d560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d570 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1d580 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
1d590 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
1d5a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d5b0 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
1d5c0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61  value of the cha
1d5d0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f  nge-counter at o
1d5e0 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32  ffsets 24 and 92
1d5f0 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   in.** the heade
1d600 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  r and the sqlite
1d610 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
1d620 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a  at offset 96..**
1d630 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75  .** This is an u
1d640 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64  nconditional upd
1d650 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74  ate.  See also t
1d660 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  he pager_incr_ch
1d670 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a  angecounter().**
1d680 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f   routine which o
1d690 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  nly updates the 
1d6a0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
1d6b0 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20  f the update is 
1d6c0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64  actually.** need
1d6d0 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65  ed, as determine
1d6e0 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d  d by the pPager-
1d6f0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1d700 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e   state variable.
1d710 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d720 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1d730 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20  gecounter(PgHdr 
1d740 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61  *pPg){.  u32 cha
1d750 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20  nge_counter;..  
1d760 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1d770 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1d780 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1d790 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1d7a0 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  /.  change_count
1d7b0 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
1d7c0 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70  byte((u8*)pPg->p
1d7d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d7e0 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74  s)+1;.  put32bit
1d7f0 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1d800 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
1d810 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a  _counter);..  /*
1d820 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20   Also store the 
1d830 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  SQLite version n
1d840 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39  umber in bytes 9
1d850 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a  6..99 and in.  *
1d860 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73  * bytes 92..95 s
1d870 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20  tore the change 
1d880 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63  counter for whic
1d890 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  h the version nu
1d8a0 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c  mber.  ** is val
1d8b0 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  id. */.  put32bi
1d8c0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1d8d0 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67  pData)+92, chang
1d8e0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75  e_counter);.  pu
1d8f0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1d900 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20  pPg->pData)+96, 
1d910 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
1d920 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64  UMBER);.}..#ifnd
1d930 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1d940 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
1d950 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1d960 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
1d970 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
1d980 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
1d990 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1d9a0 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
1d9b0 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1d9c0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
1d9d0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
1d9e0 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
1d9f0 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
1da00 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
1da10 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
1da20 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
1da30 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1da40 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
1da50 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
1da60 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
1da70 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
1da80 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1da90 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
1daa0 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
1dab0 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
1dac0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
1dad0 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
1dae0 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
1daf0 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
1db00 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
1db10 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
1db20 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
1db30 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
1db40 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1db50 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
1db60 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
1db70 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1db80 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
1db90 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
1dba0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
1dbb0 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
1dbc0 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
1dbd0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1dbe0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1dbf0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
1dc00 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
1dc10 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
1dc20 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1dc30 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d  ager) );.  pPg =
1dc40 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1dc50 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
1dc60 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
1dc70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
1dc80 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
1dc90 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
1dca0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
1dcb0 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
1dcc0 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69  lse{.      u32 i
1dcd0 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  Frame = 0;.     
1dce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1dcf0 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
1dd00 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ->pWal, pPg->pgn
1dd10 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
1dd20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1dd30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1dd40 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1dd50 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20  pPg, iFrame);.  
1dd60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1dd70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1dd80 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1dd90 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
1dda0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1ddb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1ddc0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1ddd0 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1dde0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1ddf0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1de00 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1de10 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1de20 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1de30 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1de40 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1de50 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1de60 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1de70 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1de80 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1de90 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1dea0 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1deb0 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1dec0 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1ded0 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1dee0 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1def0 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1df00 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1df10 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1df20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1df30 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1df40 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1df50 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1df60 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1df70 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1df80 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1df90 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1dfa0 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1dfb0 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1dfc0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1dfd0 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1dfe0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1dff0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e000 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1e010 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1e020 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1e030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e040 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1e050 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e060 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1e090 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1e0a0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1e0b0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1e0c0 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1e0d0 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1e0e0 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1e0f0 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1e100 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1e110 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1e120 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1e130 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1e140 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1e150 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1e160 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1e170 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1e180 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1e190 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1e1a0 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1e1b0 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1e1c0 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1e1d0 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1e1e0 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1e1f0 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1e200 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1e210 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1e220 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1e230 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1e240 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1e250 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1e260 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1e270 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1e280 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1e290 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77  r->pPCache);.  w
1e2a0 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72  hile( pList && r
1e2b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e2c0 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
1e2d0 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1e2e0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1e2f0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f  UndoCallback((vo
1e300 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  id *)pPager, pLi
1e310 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  st->pgno);.    p
1e320 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
1e330 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1e340 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1e350 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
1e360 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
1e370 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41  e3WalFrames(). A
1e380 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e  s well as loggin
1e390 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
1e3a0 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66  s of the list of
1e3b0 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79   pages headed by
1e3c0 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65   pList (connecte
1e3d0 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a  d by pDirty),.**
1e3e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
1e3f0 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69  otifies any acti
1e400 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ve backup proces
1e410 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ses that the pag
1e420 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67  es have.** chang
1e430 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ed. .**.** The l
1e440 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73  ist of pages pas
1e450 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f  sed into this ro
1e460 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20  utine is always 
1e470 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e  sorted by page n
1e480 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c  umber..** Hence,
1e490 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61   if page 1 appea
1e4a0 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  rs anywhere on t
1e4b0 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c  he list, it will
1e4c0 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61   be the first pa
1e4d0 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ge..*/ .static i
1e4e0 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  nt pagerWalFrame
1e4f0 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
1e500 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1e510 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1e520 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ject */.  PgHdr 
1e530 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
1e540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1e550 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c  t of frames to l
1e560 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72  og */.  Pgno nTr
1e570 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1e580 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1e590 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ase size after t
1e5a0 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  his commit */.  
1e5b0 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5d0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1e5e0 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29  is a commit */.)
1e5f0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e620 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73  de */.  int nLis
1e630 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1e640 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e650 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c  r of pages in pL
1e660 69 73 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ist */.#if defin
1e670 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1e680 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1e690 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 29 0a  TE_CHECK_PAGES).
1e6a0 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6c0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1e6d0 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 23   over pages */.#
1e6e0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1e6f0 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b   pPager->pWal );
1e700 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1e710 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1e720 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
1e730 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
1e740 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63  e list is in acc
1e750 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
1e760 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1e770 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70   && p->pDirty; p
1e780 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1e790 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f   assert( p->pgno
1e7a0 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67   < p->pDirty->pg
1e7b0 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  no );.  }.#endif
1e7c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ..  assert( pLis
1e7d0 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20  t->pDirty==0 || 
1e7e0 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66  isCommit );.  if
1e7f0 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ( isCommit ){.  
1e800 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72    /* If a WAL tr
1e810 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
1e820 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  ng committed, th
1e830 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
1e840 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a  in writing.    *
1e850 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68  * any pages with
1e860 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1e870 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e  eater than nTrun
1e880 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41  cate into the WA
1e890 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54  L file..    ** T
1e8a0 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hey will never b
1e8b0 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c  e read by any cl
1e8c0 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20  ient. So remove 
1e8d0 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44  them from the pD
1e8e0 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74  irty.    ** list
1e8f0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67   here. */.    Pg
1e900 48 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48 64  Hdr *p;.    PgHd
1e910 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c  r **ppNext = &pL
1e920 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  ist;.    nList =
1e930 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   0;.    for(p=pL
1e940 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20  ist; (*ppNext = 
1e950 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72  p)!=0; p=p->pDir
1e960 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ty){.      if( p
1e970 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74  ->pgno<=nTruncat
1e980 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e  e ){.        ppN
1e990 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79  ext = &p->pDirty
1e9a0 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b  ;.        nList+
1e9b0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1e9c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
1e9d0 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
1e9e0 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20     nList = 1;.  
1e9f0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61  }.  pPager->aSta
1ea00 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
1ea10 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20  TE] += nList;.. 
1ea20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
1ea30 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
1ea40 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
1ea50 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73  pList);.  rc = s
1ea60 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1ea70 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20  pPager->pWal, . 
1ea80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
1ea90 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54  eSize, pList, nT
1eaa0 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69  runcate, isCommi
1eab0 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t, pPager->walSy
1eac0 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69  ncFlags.  );.  i
1ead0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1eae0 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63   && pPager->pBac
1eaf0 6b 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72  kup ){.    PgHdr
1eb00 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
1eb10 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
1eb20 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c  irty){.      sql
1eb30 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
1eb40 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
1eb50 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a  , p->pgno, (u8 *
1eb60 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  )p->pData);.    
1eb70 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
1eb80 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1eb90 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1eba0 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1ebb0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1ebc0 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73  e);.  for(p=pLis
1ebd0 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1ebe0 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65  y){.    pager_se
1ebf0 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20  t_pagehash(p);. 
1ec00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
1ec10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ec20 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72   Begin a read tr
1ec30 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1ec40 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   WAL..**.** This
1ec50 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f   routine used to
1ec60 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65   be called "page
1ec70 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22  rOpenSnapshot()"
1ec80 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65   because it esse
1ec90 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73  ntially.** makes
1eca0 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74   a snapshot of t
1ecb0 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  he database at t
1ecc0 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74  he current point
1ecd0 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65   in time and pre
1ece0 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73  serves.** that s
1ecf0 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20  napshot for use 
1ed00 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e  by the reader in
1ed10 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72   spite of concur
1ed20 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62  rently changes b
1ed30 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65  y.** other write
1ed40 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  rs or checkpoint
1ed50 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
1ed60 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  nt pagerBeginRea
1ed70 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  dTransaction(Pag
1ed80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1ed90 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1edb0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1edc0 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d  .  int changed =
1edd0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ede0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
1edf0 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65  che must be rese
1ee00 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
1ee10 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1ee20 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
1ee30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1ee40 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
1ee50 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1ee60 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a  AGER_READER );..
1ee70 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45    /* sqlite3WalE
1ee80 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1ee90 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  n() was not call
1eea0 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ed for the previ
1eeb0 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ous.  ** transac
1eec0 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  tion in locking_
1eed0 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20  mode=EXCLUSIVE. 
1eee0 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e   So call it now.
1eef0 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65    If we.  ** are
1ef00 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1ef10 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52  =NORMAL and EndR
1ef20 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f  ead() was previo
1ef30 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a  usly called,.  *
1ef40 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  * the duplicate 
1ef50 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73  call is harmless
1ef60 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1ef70 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1ef80 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
1ef90 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  al);..  rc = sql
1efa0 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64  ite3WalBeginRead
1efb0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1efc0 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67  er->pWal, &chang
1efd0 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ed);.  if( rc!=S
1efe0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e  QLITE_OK || chan
1eff0 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72  ged ){.    pager
1f000 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1f010 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48      if( USEFETCH
1f020 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74  (pPager) ) sqlit
1f030 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
1f040 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
1f050 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1f060 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1f070 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1f080 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
1f090 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
1f0a0 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50  on from PAGER_OP
1f0b0 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52  EN.** to PAGER_R
1f0c0 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64  EADER state to d
1f0d0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1f0e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1f0f0 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67  e file.** in pag
1f100 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  es (assuming the
1f110 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65   page size curre
1f120 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50  ntly stored in P
1f130 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a  ager.pageSize)..
1f140 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
1f150 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
1f160 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1f170 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1f180 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1f190 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72  in pages is stor
1f1a0 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f  ed in *pnPage. O
1f1b0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
1f1c0 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73  or code (perhaps
1f1d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
1f1e0 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72  _FSTAT) is retur
1f1f0 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
1f200 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
1f210 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1f220 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  t pagerPagecount
1f230 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1f240 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20  Pgno *pnPage){. 
1f250 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1f260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f270 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1f280 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
1f290 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74  */..  /* Query t
1f2a0 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1f2b0 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  m for the databa
1f2c0 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c  se size. The Wal
1f2d0 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75  Dbsize().  ** fu
1f2e0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a  nction returns z
1f2f0 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69  ero if the WAL i
1f300 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e  s not open (i.e.
1f310 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c   Pager.pWal==0),
1f320 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20   or.  ** if the 
1f330 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1f340 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
1f350 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1f360 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76  e is not.  ** av
1f370 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1f380 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
1f390 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  if the log file 
1f3a0 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a  is empty or.  **
1f3b0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c   contains no val
1f3c0 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61  id committed tra
1f3d0 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  nsactions..  */.
1f3e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f3f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f400 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1f410 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1f420 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1f430 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
1f440 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65  3WalDbsize(pPage
1f450 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20  r->pWal);..  /* 
1f460 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1f470 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61  size was not ava
1f480 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1f490 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a  WAL sub-system,.
1f4a0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69    ** determine i
1f4b0 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
1f4c0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f4d0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
1f4e0 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68   size.  ** of th
1f4f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f500 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
1f510 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
1f520 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a  e page-size,.  *
1f530 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20  * round down to 
1f540 74 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65  the nearest page
1f550 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69  . Except, any fi
1f560 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30  le larger than 0
1f570 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  .  ** bytes in s
1f580 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
1f590 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20  d to contain at 
1f5a0 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a  least one page..
1f5b0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1f5c0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  ==0 ){.    i64 n
1f5d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1f5f0 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62   of db file in b
1f600 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  ytes */.    asse
1f610 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1f620 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1f630 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1f640 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1f650 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1f660 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1f670 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1f680 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
1f690 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f6a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f6b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f6c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50    }.    }.    nP
1f6d0 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b  age = (Pgno)((n+
1f6e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1f6f0 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  -1) / pPager->pa
1f700 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
1f710 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1f720 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1f730 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1f740 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1f750 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
1f760 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
1f770 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
1f780 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
1f790 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
1f7a0 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
1f7b0 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
1f7c0 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
1f7d0 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
1f7e0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
1f7f0 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
1f800 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
1f810 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1f820 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1f830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1f840 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  L./*.** Check if
1f850 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1f860 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
1f870 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1f880 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
1f890 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
1f8a0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1f8b0 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
1f8c0 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
1f8d0 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
1f8e0 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
1f8f0 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
1f900 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1f910 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
1f920 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1f930 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
1f940 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
1f950 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
1f960 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
1f970 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
1f980 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
1f990 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
1f9a0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
1f9b0 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
1f9c0 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
1f9d0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
1f9e0 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
1f9f0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
1fa00 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
1fa10 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1fa20 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1fa30 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  e..**.** The cal
1fa40 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20  ler must hold a 
1fa50 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
1fa60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fa70 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a   to call this.**
1fa80 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75   function. Becau
1fa90 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  se an EXCLUSIVE 
1faa0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66  lock on the db f
1fab0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
1fac0 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20  to delete .** a 
1fad0 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d  WAL on a none-em
1fae0 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  pty database, th
1faf0 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
1fb00 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
1fb10 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65  ition .** betwee
1fb20 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
1fb30 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
1fb40 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
1fb50 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a  cuted by some .*
1fb60 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
1fb70 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1fb80 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
1fb90 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
1fba0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1fbb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1fbc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fbd0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1fbe0 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
1fbf0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
1fc00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
1fc10 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
1fc20 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
1fc30 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20  t isWal;        
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fc50 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20  rue if WAL file 
1fc60 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67  exists */.    Pg
1fc70 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1fc90 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1fca0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
1fcb0 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
1fcc0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1fcd0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1fce0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1fcf0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1fd00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1fd10 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
1fd20 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
1fd30 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20  r->zWal, 0);.   
1fd40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fd50 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
1fd60 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49  OENT ) rc = SQLI
1fd70 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57  TE_OK;.      isW
1fd80 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  al = 0;.    }els
1fd90 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1fda0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
1fdb0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1fdc0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
1fdd0 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
1fde0 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
1fdf0 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  l.      );.    }
1fe00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1fe10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fe20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
1fe30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1fe40 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1fe50 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
1fe60 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
1fe70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fe80 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
1fe90 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
1fea0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
1feb0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
1fec0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1fed0 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
1fee0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1fef0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
1ff00 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
1ff10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ff20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ff30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
1ff40 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
1ff50 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
1ff60 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
1ff70 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
1ff80 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
1ff90 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
1ffa0 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
1ffb0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
1ffc0 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
1ffd0 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
1ffe0 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
1fff0 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
20000 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
20010 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
20020 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
20030 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
20040 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
20050 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
20060 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
20070 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
20080 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
20090 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
200a0 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
200b0 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
200c0 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
200d0 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
200e0 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
200f0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
20100 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
20110 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
20120 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
20130 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
20140 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
20150 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
20160 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
20170 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
20180 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
20190 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
201a0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
201b0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
201c0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
201d0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
201e0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
201f0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
20200 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
20210 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
20220 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
20230 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
20240 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
20250 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
20260 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
20270 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
20280 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
20290 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
202a0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
202b0 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
202c0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
202d0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
202e0 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
202f0 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
20300 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
20310 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
20320 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
20330 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
20340 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
20350 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
20360 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
20370 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
20380 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
20390 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
203a0 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
203b0 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
203c0 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
203d0 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
203e0 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
203f0 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
20400 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
20410 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
20420 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
20430 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
20440 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
20450 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
20460 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
20470 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
20480 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
20490 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
204a0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
204b0 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
204c0 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
204d0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
204e0 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
204f0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
20500 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
20510 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
20520 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
20530 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
20540 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
20550 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
20560 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
20570 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
20580 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
20590 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
205a0 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
205b0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
205c0 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
205d0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
205e0 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
205f0 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
20600 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
20610 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
20620 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
20630 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
20640 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
20650 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
20660 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
20670 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
20680 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
20690 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
206a0 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
206b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
206c0 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
206d0 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
206e0 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
206f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20700 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
20710 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
20720 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
20730 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
20740 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
20750 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
20760 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
20770 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20780 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
20790 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
207a0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
207b0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
207c0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
207d0 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
207e0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
207f0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
20800 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
20810 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
20820 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
20830 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
20840 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20850 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
20860 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
20870 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
20880 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20890 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
208a0 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
208b0 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
208c0 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
208d0 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
208e0 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
208f0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
20900 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
20910 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
20920 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
20930 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
20940 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  ;.  pPager->chan
20950 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
20960 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
20970 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69  .  if( !pSavepoi
20980 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61  nt && pagerUseWa
20990 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
209a0 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c   return pagerRol
209b0 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29  lbackWal(pPager)
209c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20  ;.  }..  /* Use 
209d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
209e0 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
209f0 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
20a00 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
20a10 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
20a20 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
20a30 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
20a40 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
20a50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20a60 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
20a70 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
20a80 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
20a90 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
20aa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20ab0 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
20ac0 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
20ad0 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
20ae0 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72  rnalOff;.  asser
20af0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
20b00 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a  Pager)==0 || szJ
20b10 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  ==0 );..  /* Beg
20b20 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
20b30 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
20b40 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20b50 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
20b60 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
20b70 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
20b80 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
20b90 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
20ba0 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
20bb0 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
20bc0 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
20bd0 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
20be0 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
20bf0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
20c00 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
20c10 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
20c20 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
20c30 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
20c40 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
20c50 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
20c60 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
20c70 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
20c80 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
20c90 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
20ca0 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73  oint && !pagerUs
20cb0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
20cc0 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
20cd0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
20ce0 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
20cf0 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
20d00 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
20d10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
20d20 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
20d30 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
20d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
20d50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20d60 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
20d70 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
20d80 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
20d90 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
20da0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
20db0 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
20dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
20dd0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
20de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
20df0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20e00 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
20e10 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20  ontinue rolling 
20e20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74  back records out
20e30 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20e40 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
20e50 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
20e60 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
20e70 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  een and continui
20e80 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66  ng until the eff
20e90 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20  ective end.  ** 
20ea0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20eb0 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69  nal file.  Conti
20ec0 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d  nue to skip out-
20ed0 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
20ee0 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65  nd.  ** continue
20ef0 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f   adding pages ro
20f00 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f  lled back to pDo
20f10 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ne..  */.  while
20f20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20f30 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
20f40 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20  alOff<szJ ){.   
20f50 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
20f60 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
20f70 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  ter */.    u32 n
20f80 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a  JRec = 0;     /*
20f90 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
20fa0 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
20fb0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
20fc0 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
20fd0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20  lHdr(pPager, 0, 
20fe0 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
20ff0 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
21000 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21010 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
21020 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
21030 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
21040 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
21050 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
21060 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
21070 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
21080 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
21090 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
210a0 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
210b0 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
210c0 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
210d0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
210e0 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
210f0 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
21100 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
21110 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
21120 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
21130 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
21140 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20  nalOff.    ){.  
21150 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32      nJRec = (u32
21160 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
21170 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55  >journalOff)/JOU
21180 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
21190 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  r));.    }.    f
211a0 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
211b0 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52  ITE_OK && ii<nJR
211c0 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ec && pPager->jo
211d0 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69  urnalOff<szJ; ii
211e0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
211f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
21200 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
21210 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
21220 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
21230 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
21240 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21250 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
21260 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21270 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
21280 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29  ournalOff>=szJ )
21290 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
212a0 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
212b0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
212c0 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
212d0 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
212e0 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
212f0 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
21300 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
21310 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
21320 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
21330 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
21340 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
21350 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
21360 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
21370 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
21380 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
21390 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
213a0 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
213b0 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f  t = (i64)pSavepo
213c0 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
213d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
213e0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
213f0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21400 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
21410 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e  lite3WalSavepoin
21420 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  tUndo(pPager->pW
21430 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  al, pSavepoint->
21440 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d  aWalData);.    }
21450 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76  .    for(ii=pSav
21460 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b  epoint->iSubRec;
21470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21480 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75  & ii<pPager->nSu
21490 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  bRec; ii++){.   
214a0 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
214b0 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50  t==(i64)ii*(4+pP
214c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
214d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
214e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
214f0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
21500 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
21510 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21520 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21530 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
21540 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
21550 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
21560 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21570 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
21580 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
21590 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
215a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
215b0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
215c0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
215d0 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
215e0 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
215f0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21600 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
21610 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
21620 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
21630 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
21640 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
21650 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
21660 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
21670 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
21680 50 5f 4c 49 4d 49 54 20 62 61 73 65 64 20 6f 6e  P_LIMIT based on
21690 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
216a0 75 65 20 6f 66 20 6d 78 4d 6d 61 70 2e 0a 2a 2f  ue of mxMmap..*/
216b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
216c0 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61  erFixMaplimit(Pa
216d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
216e0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
216f0 45 5f 44 49 53 41 42 4c 45 5f 4d 4d 41 50 29 0a  E_DISABLE_MMAP).
21700 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
21710 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b  fd = pPager->fd;
21720 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64  .  if( isOpen(fd
21730 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
21740 5f 69 6e 74 36 34 20 6d 78 3b 0a 20 20 20 20 70  _int64 mx;.    p
21750 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68  Pager->bUseFetch
21760 20 3d 20 28 66 64 2d 3e 70 4d 65 74 68 6f 64 73   = (fd->pMethods
21770 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 29 20 26  ->iVersion>=3) &
21780 26 20 70 50 61 67 65 72 2d 3e 6d 78 4d 6d 61 70  & pPager->mxMmap
21790 3e 30 3b 0a 20 20 20 20 6d 78 20 3d 20 70 50 61  >0;.    mx = pPa
217a0 67 65 72 2d 3e 6d 78 4d 6d 61 70 3b 0a 20 20 20  ger->mxMmap;.   
217b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
217c0 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
217d0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
217e0 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 26  TL_MMAP_LIMIT, &
217f0 6d 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  mx);.  }.#endif.
21800 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
21810 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  the maximum size
21820 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d   of any memory m
21830 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74  apping made of t
21840 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21850 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21860 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
21870 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
21880 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
21890 6d 78 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65  mxMmap){.  pPage
218a0 72 2d 3e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d  r->mxMmap = mxMm
218b0 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61  ap;.  pagerFixMa
218c0 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
218d0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73  }../*.** Free as
218e0 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
218f0 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
21900 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  e pager..*/.void
21910 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
21920 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ink(Pager *pPage
21930 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
21940 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72  cheShrink(pPager
21950 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
21960 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
21970 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
21980 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
21990 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
219a0 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
219b0 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
219c0 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
219d0 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
219e0 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
219f0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
21a00 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
21a10 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
21a20 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
21a30 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
21a40 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
21a50 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
21a60 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
21a70 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
21a80 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
21a90 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
21aa0 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
21ab0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
21ac0 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
21ad0 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
21ae0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
21af0 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
21b00 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
21b10 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
21b20 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
21b30 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
21b40 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
21b50 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
21b60 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
21b70 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
21b80 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
21b90 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
21ba0 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
21bb0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
21bc0 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
21bd0 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
21be0 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
21bf0 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
21c00 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
21c10 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
21c20 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
21c30 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
21c40 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
21c50 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
21c60 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
21c70 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
21c80 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
21c90 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
21ca0 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
21cb0 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
21cc0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
21cd0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
21ce0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
21cf0 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
21d00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21d10 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
21d20 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
21d30 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
21d40 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
21d50 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
21d60 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
21d70 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
21d80 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
21d90 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
21da0 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
21db0 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
21dc0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
21dd0 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
21de0 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
21df0 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
21e00 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
21e10 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66  * The above is f
21e20 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  or a rollback-jo
21e30 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72  urnal mode.  For
21e40 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63   WAL mode, OFF c
21e50 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d  ontinues.** to m
21e60 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63  ean that no sync
21e70 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e  s ever occur.  N
21e80 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74  ORMAL means that
21e90 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63   the WAL is sync
21ea0 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74  ed.** prior to t
21eb0 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63  he start of chec
21ec0 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20  kpoint and that 
21ed0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21ee0 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61  e is synced.** a
21ef0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
21f00 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
21f10 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  nt if the entire
21f20 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
21f30 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74  WAL.** was writt
21f40 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
21f50 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20   database.  But 
21f60 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f  no sync operatio
21f70 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20  ns occur for.** 
21f80 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d  an ordinary comm
21f90 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64  it in NORMAL mod
21fa0 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c  e with WAL.  FUL
21fb0 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
21fc0 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20   WAL.** file is 
21fd0 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
21fe0 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65   each commit ope
21ff0 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74  ration, in addit
22000 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79  ion to the.** sy
22010 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ncs associated w
22020 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a  ith NORMAL..**.*
22030 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65  * Do not confuse
22040 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
22050 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59  L with SQLITE_SY
22060 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a  NC_FULL.  The.**
22070 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22080 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f  L macro means to
22090 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d   use the MacOSX-
220a0 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63  style full-fsync
220b0 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  .** using fcntl(
220c0 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53  F_FULLFSYNC).  S
220d0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
220e0 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e  L means to do an
220f0 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79  .** ordinary fsy
22100 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72  nc() call.  Ther
22110 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
22120 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54  ce between SQLIT
22130 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61  E_SYNC_FULL.** a
22140 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  nd SQLITE_SYNC_N
22150 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72  ORMAL on platfor
22160 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61  ms other than Ma
22170 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a  cOSX.  But the.*
22180 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  * synchronous=FU
22190 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72  LL versus synchr
221a0 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74  onous=NORMAL set
221b0 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20  ting determines 
221c0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e  when.** the xSyn
221d0 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63  c primitive is c
221e0 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c  alled and is rel
221f0 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61  evant to all pla
22200 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75  tforms..**.** Nu
22210 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
22220 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22230 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
22240 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
22250 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
22260 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22270 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
22280 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
22290 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
222a0 76 65 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50  vel(.  Pager *pP
222b0 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
222c0 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74  The pager to set
222d0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f   safety level fo
222e0 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c  r */.  int level
222f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
22300 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
22310 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f  us.  1=OFF, 2=NO
22320 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 20  RMAL, 3=FULL */ 
22330 20 0a 20 20 69 6e 74 20 62 46 75 6c 6c 46 73 79   .  int bFullFsy
22340 6e 63 2c 20 20 20 20 20 20 20 2f 2a 20 50 52 41  nc,       /* PRA
22350 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20 2a 2f  GMA fullfsync */
22360 0a 20 20 69 6e 74 20 62 43 6b 70 74 46 75 6c 6c  .  int bCkptFull
22370 46 73 79 6e 63 20 20 20 20 2f 2a 20 50 52 41 47  Fsync    /* PRAG
22380 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75  MA checkpoint_fu
22390 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20  llfsync */.){.  
223a0 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31  assert( level>=1
223b0 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a   && level<=3 );.
223c0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
223d0 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c   =  (level==1 ||
223e0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
223f0 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
22400 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c  r->fullSync = (l
22410 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
22420 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
22430 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  :0;.  if( pPager
22440 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
22450 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22460 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  s = 0;.    pPage
22470 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22480 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
22490 28 20 62 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a  ( bFullFsync ){.
224a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
224b0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
224c0 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50  YNC_FULL;.    pP
224d0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
224e0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
224f0 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20  C_FULL;.  }else 
22500 69 66 28 20 62 43 6b 70 74 46 75 6c 6c 46 73 79  if( bCkptFullFsy
22510 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
22520 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
22530 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22540 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22550 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
22560 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
22570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
22580 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
22590 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
225a0 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
225b0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
225c0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
225d0 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MAL;.  }.  pPage
225e0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
225f0 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  = pPager->syncFl
22600 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ags;.  if( pPage
22610 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
22620 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
22630 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53  ncFlags |= WAL_S
22640 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
22650 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
22660 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
22670 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
22680 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
22690 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
226a0 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
226b0 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
226c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
226d0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
226e0 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
226f0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
22700 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
22710 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
22720 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
22730 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
22740 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
22750 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
22760 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
22770 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
22780 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
22790 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
227a0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
227b0 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
227c0 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
227d0 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
227e0 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
227f0 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
22800 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
22810 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
22820 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
22830 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
22840 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
22850 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
22860 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
22870 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
22880 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
22890 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
228a0 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
228b0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
228c0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
228d0 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
228e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
228f0 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
22900 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
22910 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
22920 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
22930 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
22940 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
22950 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
22960 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
22970 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
22980 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
22990 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
229a0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
229b0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
229c0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
229d0 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
229e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
229f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
22a00 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
22a10 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
22a20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
22a30 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
22a40 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
22a50 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
22a60 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
22a70 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
22a80 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
22a90 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
22aa0 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
22ab0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22ac0 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
22ad0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
22ae0 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
22af0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
22b00 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
22b10 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
22b20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
22b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
22b40 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
22b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22b60 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
22b70 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
22b80 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
22b90 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
22ba0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
22bb0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
22bc0 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
22bd0 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
22be0 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
22bf0 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
22c00 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
22c10 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
22c20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
22c30 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
22c40 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
22c50 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
22c60 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
22c70 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
22c80 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
22c90 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
22ca0 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
22cb0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
22cc0 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
22cd0 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
22ce0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
22cf0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
22d00 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
22d10 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d30 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
22d40 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
22d50 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
22d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
22d90 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
22da0 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
22db0 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
22dc0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
22dd0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
22de0 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
22df0 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
22e00 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
22e10 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
22e20 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
22e30 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
22e40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
22e50 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
22e60 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
22e70 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
22e80 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
22e90 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
22ea0 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
22eb0 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
22ec0 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
22ed0 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
22ee0 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
22ef0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
22f00 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
22f10 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
22f20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f40 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
22f50 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
22f60 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
22f70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
22f80 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
22f90 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
22fa0 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
22fb0 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
22fc0 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
22fd0 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
22fe0 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
22ff0 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
23000 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
23010 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
23020 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
23030 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
23040 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  Arg;..  if( isOp
23050 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
23060 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20  {.    void **ap 
23070 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67  = (void **)&pPag
23080 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
23090 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
230a0 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28  int(*)(void *))(
230b0 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61  ap[0]))==xBusyHa
230c0 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73  ndler );.    ass
230d0 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73  ert( ap[1]==pBus
230e0 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20  yHandlerArg );. 
230f0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
23100 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
23110 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
23120 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52  CNTL_BUSYHANDLER
23130 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20  , (void *)ap);. 
23140 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
23150 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
23160 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
23170 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
23180 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
23190 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
231a0 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
231b0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
231c0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
231d0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
231e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
231f0 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
23200 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
23210 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
23220 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
23230 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
23240 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
23250 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  R, an SQLITE_IOE
23260 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20  RR_xxx sub-code 
23270 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
23280 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
23290 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
232a0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
232b0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
232c0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
232d0 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
232e0 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
232f0 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
23300 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
23310 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
23320 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
23330 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
23340 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
23350 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
23360 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
23370 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
23380 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
23390 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
233a0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
233b0 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
233c0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
233d0 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
233e0 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
233f0 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
23400 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
23410 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
23420 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
23430 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
23440 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
23450 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
23460 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
23470 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
23480 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
23490 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
234a0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
234b0 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
234c0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
234d0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
234e0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
234f0 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
23500 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
23510 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
23520 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
23530 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
23540 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
23550 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
23560 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
23570 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
23580 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
23590 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
235a0 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
235b0 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
235c0 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
235d0 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
235e0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
235f0 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
23600 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
23610 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
23620 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
23630 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
23640 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
23650 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
23660 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
23670 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
23680 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
23690 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
236a0 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  32 *pPageSize, i
236b0 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
236c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
236d0 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  OK;..  /* It is 
236e0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
236f0 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74  do a full assert
23700 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68  _pager_state() h
23710 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a  ere, as this.  *
23720 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  * function may b
23730 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  e called from wi
23740 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29  thin PagerOpen()
23750 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61  , before the sta
23760 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50  te.  ** of the P
23770 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69  ager object is i
23780 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73  nternally consis
23790 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tent..  **.  ** 
237a0 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69  At one point thi
237b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
237c0 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ned an error if 
237d0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
237e0 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52   .  ** PAGER_ERR
237f0 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69  OR state. But si
23800 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20  nce PAGER_ERROR 
23810 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73  state guarantees
23820 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65   that.  ** there
23830 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   is at least one
23840 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
23850 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69  e reference, thi
23860 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
23870 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
23880 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e  hat case anyhow.
23890 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67  .  */..  u32 pag
238a0 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
238b0 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ze;.  assert( pa
238c0 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
238d0 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
238e0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
238f0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
23900 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
23910 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
23920 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
23930 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
23940 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
23950 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
23960 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20  .   && pageSize 
23970 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33  && pageSize!=(u3
23980 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
23990 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  ze .  ){.    cha
239a0 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20  r *pNew = NULL; 
239b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
239c0 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f  ew temp space */
239d0 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d  .    i64 nByte =
239e0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61   0;..    if( pPa
239f0 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
23a00 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e  R_OPEN && isOpen
23a10 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
23a20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23a30 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
23a40 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29  ger->fd, &nByte)
23a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23a60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23a70 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63  .      pNew = (c
23a80 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
23a90 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
23aa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
23ab0 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ew ) rc = SQLITE
23ac0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20  _NOMEM;.    }.. 
23ad0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23ae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  E_OK ){.      pa
23af0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
23b00 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
23b10 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29  >dbSize = (Pgno)
23b20 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65  ((nByte+pageSize
23b30 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20  -1)/pageSize);. 
23b40 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
23b50 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
23b60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
23b70 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
23b80 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
23b90 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
23ba0 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
23bb0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
23bc0 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
23bd0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
23be0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Size);.    }.  }
23bf0 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d  ..  *pPageSize =
23c00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
23c10 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  e;.  if( rc==SQL
23c20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
23c30 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e  ( nReserve<0 ) n
23c40 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72  Reserve = pPager
23c50 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
23c60 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
23c70 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
23c80 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67  1000 );.    pPag
23c90 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
23ca0 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  i16)nReserve;.  
23cb0 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
23cc0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
23cd0 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
23ce0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
23cf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23d00 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
23d10 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
23d20 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
23d30 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
23d40 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
23d50 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
23d60 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
23d70 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
23d80 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
23d90 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
23da0 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
23db0 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
23dc0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
23dd0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
23de0 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
23df0 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
23e00 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
23e10 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
23e20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
23e30 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
23e40 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
23e50 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
23e60 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
23e70 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
23e80 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
23e90 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
23ea0 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
23eb0 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
23ec0 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
23ed0 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
23ee0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
23ef0 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
23f00 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
23f10 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
23f20 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
23f30 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
23f40 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
23f50 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
23f60 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
23f70 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
23f80 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
23f90 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
23fa0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
23fb0 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
23fc0 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
23fd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
23fe0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
23ff0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
24000 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
24010 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
24020 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
24030 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61   mxPage;.  }.  a
24040 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
24050 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
24060 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c  N );      /* Cal
24070 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d  led only by OP_M
24080 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73  axPgcnt */.  ass
24090 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50  ert( pPager->mxP
240a0 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno>=pPager->dbS
240b0 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61  ize );  /* OP_Ma
240c0 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20  xPgcnt enforces 
240d0 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e  this */.  return
240e0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
240f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
24100 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
24110 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
24120 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
24130 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
24140 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
24150 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
24160 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
24170 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
24180 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
24190 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
241a0 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
241b0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
241c0 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
241d0 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
241e0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
241f0 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
24200 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
24210 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
24220 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
24230 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
24240 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
24250 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
24260 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
24270 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
24280 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
24290 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
242a0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
242b0 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
242c0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
242d0 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
242e0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
242f0 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
24300 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24310 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
24320 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24330 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
24340 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
24350 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
24360 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
24370 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
24380 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24390 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
243a0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
243b0 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
243c0 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
243d0 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
243e0 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
243f0 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
24400 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
24410 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
24420 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
24430 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
24440 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
24450 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
24460 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
24470 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
24480 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
24490 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
244a0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
244b0 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
244c0 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
244d0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
244e0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
244f0 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
24500 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
24510 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
24520 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
24530 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
24540 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
24550 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
24560 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
24570 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
24580 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
24590 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
245a0 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
245b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
245c0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
245d0 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
245e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
245f0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
24600 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
24610 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
24620 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
24630 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
24640 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
24650 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
24660 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24670 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
24680 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
24690 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
246a0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
246b0 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  mpFile );..  /* 
246c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
246d0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62  only called by b
246e0 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  tree immediately
246f0 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a   after creating.
24700 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f    ** the Pager o
24710 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61  bject.  There ha
24720 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70  s not been an op
24730 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61  portunity to tra
24740 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  nsition.  ** to 
24750 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20  WAL mode yet..  
24760 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
24770 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
24780 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  ) );..  if( isOp
24790 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
247a0 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
247b0 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
247c0 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
247d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
247e0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
247f0 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
24800 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24810 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
24820 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
24830 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24840 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
24850 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
24860 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
24870 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ly be called whe
24880 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
24890 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a  tion is open on.
248a0 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  ** the pager. It
248b0 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
248c0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
248d0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
248e0 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65  se..**.** Howeve
248f0 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
24900 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
24910 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
24920 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
24930 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
24940 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
24950 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
24960 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
24970 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
24980 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
24990 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
249a0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
249b0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
249c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
249d0 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
249e0 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20  R_FINISHED );.  
249f0 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70  *pnPage = (int)p
24a00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d  Pager->dbSize;.}
24a10 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
24a20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
24a30 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
24a40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24a50 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
24a60 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
24a70 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
24a80 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
24a90 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
24aa0 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
24ab0 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
24ac0 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
24ad0 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
24ae0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
24af0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
24b00 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
24b10 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
24b20 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
24b30 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
24b40 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
24b50 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
24b60 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
24b70 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
24b80 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
24b90 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
24ba0 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
24bb0 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
24bc0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
24bd0 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
24be0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
24bf0 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
24c00 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
24c10 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
24c20 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
24c30 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
24c40 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
24c50 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
24c60 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
24c70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
24c80 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
24c90 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24ca0 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
24cb0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cd0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
24ce0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  de */..  /* Chec
24cf0 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
24d00 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
24d10 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
24d20 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
24d30 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ** already held,
24d40 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
24d50 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74  ransistions that
24d60 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
24d70 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
24d80 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
24d90 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
24da0 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
24db0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
24dc0 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
24dd0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
24de0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c  pPager->eLock>=l
24df0 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
24e00 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
24e10 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f  k==NO_LOCK && lo
24e20 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
24e30 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  OCK).       || (
24e40 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52  pPager->eLock==R
24e50 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
24e60 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
24e70 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a  IVE_LOCK).  );..
24e80 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
24e90 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
24ea0 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  er, locktype);. 
24eb0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
24ec0 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67  ITE_BUSY && pPag
24ed0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
24ee0 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
24ef0 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72  ndlerArg) );.  r
24f00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24f10 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65  ** Function asse
24f20 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
24f30 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65  aint(pPager) che
24f40 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  cks that one of 
24f50 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
24f60 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c  g is true for al
24f70 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75  l dirty pages cu
24f80 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
24f90 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a  age-cache:.**.**
24fa0 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e     a) The page n
24fb0 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
24fc0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
24fd0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
24fe0 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20  **      current 
24ff0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
25000 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a  in pages, OR.**.
25010 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70  **   b) if the p
25020 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65  age content were
25030 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73   written at this
25040 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20   time, it would 
25050 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e  not.**      be n
25060 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
25070 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
25080 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65  ntent out to the
25090 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
250a0 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69       (as determi
250b0 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  ned by function 
250c0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
250d0 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ())..**.** If th
250e0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65  e condition asse
250f0 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rted by this fun
25100 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ction were not t
25110 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rue, and the.** 
25120 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20  dirty page were 
25130 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20  to be discarded 
25140 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76  from the cache v
25150 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65  ia the pagerStre
25160 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  ss().** routine,
25170 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77   pagerStress() w
25180 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
25190 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
251a0 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68  content to.** th
251b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
251c0 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   If a savepoint 
251d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65  transaction were
251e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
251f0 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65  er.** this happe
25200 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ned, the correct
25210 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20   behavior would 
25220 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  be to restore th
25230 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e  e current.** con
25240 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
25250 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  . However, since
25260 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73   this content is
25270 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
25280 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61  either.** the da
25290 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74  tabase file or t
252a0 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  he portion of th
252b0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
252c0 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a  al and .** sub-j
252d0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61  ournal rolled ba
252e0 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  ck the content c
252f0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74  ould not be rest
25300 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ored and the.** 
25310 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77  database image w
25320 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
25330 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65  upt. It is there
25340 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74  fore fortunate t
25350 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72  hat .** this cir
25360 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74  cumstance cannot
25370 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64   arise..*/.#if d
25380 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
25390 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
253a0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
253b0 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64  onstraintCb(PgHd
253c0 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  r *pPg){.  asser
253d0 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
253e0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61  HDR_DIRTY );.  a
253f0 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75  ssert( !subjRequ
25400 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c  iresPage(pPg) ||
25410 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d   pPg->pgno<=pPg-
25420 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
25430 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
25440 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
25450 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20  onstraint(Pager 
25460 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
25470 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
25480 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
25490 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75  Cache, assertTru
254a0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
254b0 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  b);.}.#else.# de
254c0 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63  fine assertTrunc
254d0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
254e0 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ager).#endif../*
254f0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
25500 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
25510 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74  ase file image t
25520 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54  o nPage pages. T
25530 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
25540 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c   does not actual
25550 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ly modify the da
25560 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
25570 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74  isk. It .** just
25580 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e   sets the intern
25590 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
255a0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20  pager object so 
255b0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75  that the .** tru
255c0 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ncation will be 
255d0 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75  done when the cu
255e0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
255f0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
25600 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
25610 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
25620 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20  ed right before 
25630 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
25640 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63  nsaction..** Onc
25650 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
25660 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  has been called,
25670 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
25680 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 0a   must either be.
25690 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ** rolled back o
256a0 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20  r committed. It 
256b0 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63  is not safe to c
256c0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
256d0 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f  n and.** then co
256e0 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74  ntinue writing t
256f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
25700 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
25710 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
25720 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
25730 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
25740 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25750 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b  dbSize>=nPage );
25760 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25770 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
25780 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
25790 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
257a0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20  Size = nPage;.. 
257b0 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
257c0 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 63   the code here c
257d0 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e  alled assertTrun
257e0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29  cateConstraint()
257f0 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20   to.  ** ensure 
25800 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62  that all pages b
25810 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61  eing truncated a
25820 77 61 79 20 62 79 20 74 68 69 73 20 6f 70 65 72  way by this oper
25830 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20  ation are,.  ** 
25840 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  if one or more s
25850 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70  avepoints are op
25860 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74  en, present in t
25870 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
25880 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ** journal so th
25890 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72  at they can be r
258a0 65 73 74 6f 72 65 64 20 69 66 20 74 68 65 20 73  estored if the s
258b0 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c  avepoint is roll
258c0 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68  ed.  ** back. Th
258d0 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  is is no longer 
258e0 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 69  necessary as thi
258f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
25900 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c  w only.  ** call
25910 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20  ed right before 
25920 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
25930 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74  nsaction. So alt
25940 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20  hough the .  ** 
25950 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79  Pager object may
25960 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e   still have open
25970 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67   savepoints (Pag
25980 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30  er.nSavepoint!=0
25990 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61  ), .  ** they ca
259a0 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
259b0 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65  ack. So the asse
259c0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
259d0 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a  aint() call.  **
259e0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f   is no longer co
259f0 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a  rrect. */.}.../*
25a00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
25a10 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
25a20 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20  re attempting a 
25a30 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
25a40 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63  back. It.** sync
25a50 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
25a60 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e  le to disk, then
25a70 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f   sets pPager->jo
25a80 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a  urnalHdr to the.
25a90 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  ** size of the j
25aa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74  ournal file so t
25ab0 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c  hat the pager_pl
25ac0 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
25ad0 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74   knows.** that t
25ae0 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
25af0 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
25b00 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79  synced..**.** Sy
25b10 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  ncing a hot-jour
25b20 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f  nal to disk befo
25b30 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
25b40 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e   roll it back en
25b50 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69  sures .** that i
25b60 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  f a power-failur
25b70 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  e occurs during 
25b80 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  the rollback, th
25b90 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a  e process that.*
25ba0 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62  * attempts rollb
25bb0 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79  ack following sy
25bc0 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65  stem recovery se
25bd0 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72  es the same jour
25be0 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  nal.** content a
25bf0 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  s this process..
25c00 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
25c10 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e  ing goes as plan
25c20 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ned, SQLITE_OK i
25c30 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
25c40 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51  rwise, .** an SQ
25c50 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
25c60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
25c70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
25c80 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
25c90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
25ca0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
25cb0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
25cc0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
25cd0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
25ce0 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
25cf0 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20  C_NORMAL);.  }. 
25d00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25d10 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
25d20 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
25d30 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
25d40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
25d50 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
25d60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62   rc;.}../*.** Ob
25d70 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
25d80 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70   to a memory map
25d90 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20  ped page object 
25da0 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
25db0 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65  pgno. .** The ne
25dc0 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73  w object will us
25dd0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44  e the pointer pD
25de0 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72  ata, obtained fr
25df0 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20  om xFetch()..** 
25e00 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
25e10 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f  et *ppPage to po
25e20 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
25e30 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  age reference.**
25e40 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
25e50 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
25e60 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
25e70 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  te error code an
25e80 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65  d set.** *ppPage
25e90 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
25ea0 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  Page references 
25eb0 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c  obtained by call
25ec0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
25ed0 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65  n should be rele
25ee0 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69  ased.** by calli
25ef0 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  ng pagerReleaseM
25f00 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
25f10 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
25f20 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50  uireMapPage(.  P
25f30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
25f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25f50 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
25f60 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f80 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
25f90 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44  er */.  void *pD
25fa0 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
25fb0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
25fc0 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74  h()'d data for t
25fd0 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
25fe0 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20  Hdr **ppPage    
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26000 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70   OUT: Acquired p
26010 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  age object */.){
26020 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
26030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26040 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
26050 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75  ped page to retu
26060 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  rn */..  if( pPa
26070 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26080 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  st ){.    *ppPag
26090 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  e = p = pPager->
260a0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
260b0 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70     pPager->pMmap
260c0 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44  Freelist = p->pD
260d0 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
260e0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d  rty = 0;.    mem
260f0 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30  set(p->pExtra, 0
26100 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
26110 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26120 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50  *ppPage = p = (P
26130 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61  gHdr *)sqlite3Ma
26140 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
26150 50 67 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d  PgHdr) + pPager-
26160 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66  >nExtra);.    if
26170 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( p==0 ){.      
26180 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
26190 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
261a0 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
261b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
261c0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74  Data);.      ret
261d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
261e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
261f0 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29  Extra = (void *)
26200 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c  &p[1];.    p->fl
26210 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50  ags = PGHDR_MMAP
26220 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20  ;.    p->nRef = 
26230 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72  1;.    p->pPager
26240 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a   = pPager;.  }..
26250 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78    assert( p->pEx
26260 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b  tra==(void *)&p[
26270 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1] );.  assert( 
26280 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  p->pPage==0 );. 
26290 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67   assert( p->flag
262a0 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b  s==PGHDR_MMAP );
262b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
262c0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
262d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
262e0 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67  f==1 );..  p->pg
262f0 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e  no = pgno;.  p->
26300 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20  pData = pData;. 
26310 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
26320 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  t++;..  return S
26330 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
26340 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
26350 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70  erence to page p
26360 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76  Pg. pPg must hav
26370 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20  e been returned 
26380 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65  by an .** earlie
26390 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41  r call to pagerA
263a0 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e  cquireMapPage().
263b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
263c0 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
263d0 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
263e0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
263f0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
26400 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
26410 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69  ut--;.  pPg->pDi
26420 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  rty = pPager->pM
26430 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70  mapFreelist;.  p
26440 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26450 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61  list = pPg;..  a
26460 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
26470 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
26480 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71  rsion>=3 );.  sq
26490 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
264a0 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
264b0 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50  (pPg->pgno-1)*pP
264c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
264d0 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a  pPg->pData);.}..
264e0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50  /*.** Free all P
264f0 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f  gHdr objects sto
26500 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72  red in the Pager
26510 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c  .pMmapFreelist l
26520 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
26530 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70  oid pagerFreeMap
26540 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67  Hdrs(Pager *pPag
26550 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  er){.  PgHdr *p;
26560 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b  .  PgHdr *pNext;
26570 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d  .  for(p=pPager-
26580 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20  >pMmapFreelist; 
26590 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
265a0 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72   pNext = p->pDir
265b0 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ty;.    sqlite3_
265c0 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
265d0 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
265e0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
265f0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
26600 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
26610 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
26620 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
26630 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
26640 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
26650 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
26660 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
26670 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
26680 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
26690 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
266a0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
266b0 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
266c0 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
266d0 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
266e0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
266f0 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
26700 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
26710 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
26720 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
26730 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
26740 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
26750 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
26760 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
26770 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
26780 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
26790 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
267a0 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
267b0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
267c0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
267d0 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
267e0 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
267f0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
26800 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
26810 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
26820 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
26830 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
26840 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
26850 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  r){.  u8 *pTmp =
26860 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
26870 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73  TmpSpace;..  ass
26880 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
26890 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
268a0 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  );.  disable_sim
268b0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
268c0 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
268d0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
268e0 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70  ;.  pagerFreeMap
268f0 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20  Hdrs(pPager);.  
26900 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  /* pPager->errCo
26910 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  de = 0; */.  pPa
26920 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
26930 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  de = 0;.#ifndef 
26940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
26950 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73    sqlite3WalClos
26960 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
26970 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
26980 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70  Flags, pPager->p
26990 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a  ageSize, pTmp);.
269a0 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d    pPager->pWal =
269b0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67   0;.#endif.  pag
269c0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
269d0 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
269e0 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
269f0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  k(pPager);.  }el
26a00 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  se{.    /* If it
26a10 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74   is open, sync t
26a20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26a30 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55  before calling U
26a40 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
26a50 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
26a60 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68   is not done, th
26a70 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70  en an unsynced p
26a80 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  ortion of the op
26a90 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  en journal .    
26aa0 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70  ** file may be p
26ab0 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
26ac0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
26ad0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
26ae0 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20   occurs .    ** 
26af0 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61  while this is ha
26b00 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74  ppening, the dat
26b10 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f  abase could beco
26b20 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20  me corrupt..    
26b30 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20  **.    ** If an 
26b40 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
26b50 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e  le trying to syn
26b60 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  c the journal, s
26b70 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20  hift the pager. 
26b80 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45     ** into the E
26b90 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73  RROR state. This
26ba0 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e   causes UnlockAn
26bb0 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c  dRollback to unl
26bc0 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ock the.    ** d
26bd0 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73  atabase and clos
26be0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
26bf0 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d  le without attem
26c00 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
26c10 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20  .    ** back or 
26c20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65  finalize it. The
26c30 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75   next database u
26c40 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f  ser will have to
26c50 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a   do hot-journal.
26c60 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
26c70 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67  before accessing
26c80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26c90 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
26ca0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
26cb0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
26cc0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
26cd0 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74  er, pagerSyncHot
26ce0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29  Journal(pPager))
26cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
26d00 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
26d10 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
26d20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
26d30 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
26d40 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
26d50 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
26d60 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
26d70 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
26d80 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
26d90 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
26da0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
26db0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
26dc0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71  ager->jfd);.  sq
26dd0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
26de0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
26df0 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
26e00 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
26e10 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
26e20 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
26e30 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
26e40 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
26e50 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
26e60 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
26e70 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
26e80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
26e90 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
26ea0 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
26eb0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
26ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
26ed0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
26ee0 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
26ef0 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
26f00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
26f10 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
26f20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
26f30 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
26f40 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
26f50 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
26f60 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
26f70 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
26f80 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
26f90 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
26fa0 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
26fb0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
26fc0 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
26fd0 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
26fe0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
26ff0 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
27000 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27010 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
27020 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
27030 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
27040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
27050 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
27060 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
27070 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
27080 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
27090 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
270a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
270b0 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
270c0 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
270d0 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
270e0 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
270f0 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
27100 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
27110 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
27120 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  If the Pager.noS
27130 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ync flag is set,
27140 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
27150 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
27160 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
27170 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
27180 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
27190 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e   journal-mode an
271a0 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65  d the .** device
271b0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
271c0 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
271d0 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  tem, as follows:
271e0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
271f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
27200 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  s an in-memory j
27210 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20  ournal file, no 
27220 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20  action need.**  
27230 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a     be taken..**.
27240 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65  **   * Otherwise
27250 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20  , if the device 
27260 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
27270 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44   the SAFE_APPEND
27280 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20   property,.**   
27290 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20    then the nRec 
272a0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
272b0 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
272c0 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
272d0 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61  r.**     is upda
272e0 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ted to contain t
272f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75  he number of jou
27300 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61  rnal records tha
27310 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65  t have.**     be
27320 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f  en written follo
27330 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20  wing it. If the 
27340 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69  pager is operati
27350 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a  ng in full-sync.
27360 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65  **     mode, the
27370 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
27380 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66  le is synced bef
27390 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69  ore this field i
273a0 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s updated..**.**
273b0 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69     * If the devi
273c0 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
273d0 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49  ort the SEQUENTI
273e0 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  AL property, the
273f0 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  n .**     journa
27400 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
27410 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70  ..**.** Or, in p
27420 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a  seudo-code:.**.*
27430 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d  *   if( NOT <in-
27440 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20  memory journal> 
27450 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  ){.**     if( NO
27460 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b  T SAFE_APPEND ){
27470 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66  .**       if( <f
27480 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29  ull-sync mode> )
27490 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
274a0 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20  file>);.**      
274b0 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69   <update nRec fi
274c0 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a  eld>.**     } .*
274d0 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45  *     if( NOT SE
274e0 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63  QUENTIAL ) xSync
274f0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
27500 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49  ;.**   }.**.** I
27510 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
27520 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
27530 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
27540 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
27550 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
27560 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
27570 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
27580 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
27590 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
275a0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
275b0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
275c0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
275d0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
275e0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
275f0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
27600 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
27610 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e  nt newHdr){.  in
27620 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
27630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27640 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
27650 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27660 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
27670 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
27680 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
27690 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
276a0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
276b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
276c0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
276d0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
276e0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
276f0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
27700 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
27710 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
27720 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
27730 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
27740 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
27750 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
27760 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
27770 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
27780 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
27790 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
277a0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
277b0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
277c0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
277d0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
277e0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
277f0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
27800 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
27810 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
27820 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
27830 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20  r->jfd) );..    
27840 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
27850 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
27860 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
27870 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
27880 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f   deals with an o
27890 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20  bscure problem. 
278a0 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  If the last conn
278b0 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ection.        *
278c0 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20  * that wrote to 
278d0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61  this database wa
278e0 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70  s operating in p
278f0 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  ersistent-journa
27900 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  l.        ** mod
27910 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
27920 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20  nal file may at 
27930 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61  this point actua
27940 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20  lly be larger.  
27950 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61        ** than Pa
27960 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62  ger.journalOff b
27970 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78  ytes. If the nex
27980 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a  t thing in the j
27990 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
279a0 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74  * file happens t
279b0 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  o be a journal-h
279c0 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61  eader (written a
279d0 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
279e0 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
279f0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74  s connection's t
27a00 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
27a10 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
27a20 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
27a30 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
27a40 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
27a50 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
27a60 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
27a70 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
27a80 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
27a90 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
27aa0 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
27ab0 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
27ac0 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
27ad0 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
27ae0 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
27af0 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
27b00 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
27b10 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
27b20 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
27b30 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
27b40 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
27b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
27b60 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
27b70 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
27b80 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
27b90 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
27ba0 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
27bb0 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
27bc0 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
27bd0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
27be0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
27bf0 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
27c00 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
27c10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
27c20 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
27c30 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
27c40 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
27c50 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
27c60 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
27c70 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
27c80 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
27c90 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
27ca0 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
27cb0 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
27cc0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
27cd0 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
27ce0 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
27cf0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
27d00 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
27d10 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
27d20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
27d30 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
27d40 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
27d50 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
27d60 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
27d70 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
27d80 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
27d90 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
27da0 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
27db0 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
27dc0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
27dd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27de0 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
27df0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38  fset;.        u8
27e00 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20   aMagic[8];.    
27e10 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73      u8 zHeader[s
27e20 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
27e30 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20  gic)+4];..      
27e40 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
27e50 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
27e60 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
27e70 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
27e80 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
27e90 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
27ea0 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
27eb0 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
27ec0 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73      iNextHdrOffs
27ed0 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  et = journalHdrO
27ee0 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
27ef0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
27f00 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
27f10 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38  ->jfd, aMagic, 8
27f20 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
27f30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27f50 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  0==memcmp(aMagic
27f60 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
27f70 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   8) ){.         
27f80 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
27f90 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20   zerobyte = 0;. 
27fa0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
27fb0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
27fc0 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62  ger->jfd, &zerob
27fd0 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72  yte, 1, iNextHdr
27fe0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
27ff0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
28000 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
28010 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
28020 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
28030 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
28040 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
28050 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
28060 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
28070 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
28080 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
28090 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
280a0 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
280b0 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
280c0 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
280d0 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
280e0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
280f0 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
28100 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
28110 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
28120 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
28130 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
28140 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
28150 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ack..        **.
28160 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
28170 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
28180 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  if the persisten
28190 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73  t media supports
281a0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
281b0 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
281c0 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e  erty. Because in
281d0 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
281e0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20   not possible . 
281f0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61         ** for ga
28200 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65  rbage data to be
28210 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
28220 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20   file, the nRec 
28230 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  field.        **
28240 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
28250 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68  th 0xFFFFFFFF wh
28260 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  en the journal h
28270 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
28280 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
28290 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
282a0 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  e updated..     
282b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
282c0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
282d0 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
282e0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
282f0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
28300 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28310 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
28320 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28330 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
28340 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
28350 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
28360 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
28370 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
28380 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
28390 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
283a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
283b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
283c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
283d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
283e0 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
283f0 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
28400 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28410 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72  Hdr));.        r
28420 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
28430 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  te(.            
28440 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
28450 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
28460 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a  ader), pPager->j
28470 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
28480 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
28490 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
284a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
284b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
284c0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
284d0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
284e0 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
284f0 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
28500 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
28510 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
28520 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28530 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
28540 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
28550 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
28560 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
28570 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
28580 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28  gs| .          (
28590 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
285a0 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
285b0 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
285c0 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
285d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
285e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
285f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28600 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61      }..      pPa
28610 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
28620 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
28630 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  lOff;.      if( 
28640 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44  newHdr && 0==(iD
28650 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
28660 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
28670 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
28680 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
28690 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
286a0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
286b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
286c0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
286d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
286e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
286f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
28700 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
28710 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
28720 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74  }..  /* Unless t
28730 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
28740 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  oSync mode, the 
28750 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73  journal file was
28760 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63   just .  ** succ
28770 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
28780 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65   Either way, cle
28790 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
287a0 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a  D_SYNC flag on .
287b0 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a    ** all pages..
287c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
287d0 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61  acheClearSyncFla
287e0 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
287f0 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  he);.  pPager->e
28800 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
28810 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73  ITER_DBMOD;.  as
28820 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
28830 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
28840 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
28850 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
28860 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
28870 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
28880 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64  linked list of d
28890 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65  irty pages conne
288a0 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50  cted.** by the P
288b0 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
288c0 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
288d0 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f  on writes each o
288e0 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d  ne of the.** in-
288f0 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20  memory pages in 
28900 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20  the list to the 
28910 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
28920 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a  he argument may.
28930 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72  ** be NULL, repr
28940 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74  esenting an empt
28950 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20  y list. In this 
28960 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  case this functi
28970 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  on is.** a no-op
28980 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
28990 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c  r must hold at l
289a0 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
289b0 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66  lock when this f
289c0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
289d0 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69  lled. Before wri
289e0 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f  ting anything to
289f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28a00 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a  le, this lock.**
28a10 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20   is upgraded to 
28a20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
28a30 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63  k. If the lock c
28a40 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
28a50 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d,.** SQLITE_BUS
28a60 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  Y is returned an
28a70 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69  d no data is wri
28a80 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
28a90 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
28aa0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
28ab0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61  s a temp-file pa
28ac0 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75  ger and the actu
28ad0 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  al file-system f
28ae0 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65  ile.** is not ye
28af0 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72  t open, it is cr
28b00 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  eated and opened
28b10 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
28b20 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
28b30 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  out..**.** Once 
28b40 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
28b50 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20  n upgraded and, 
28b60 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68  if necessary, th
28b70 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a  e file opened,.*
28b80 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20  * the pages are 
28b90 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
28ba0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28bb0 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20   in list order. 
28bc0 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67  Writing.** a pag
28bd0 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  e is skipped if 
28be0 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20  it meets either 
28bf0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
28c00 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a   criteria:.**.**
28c10 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75     * The page nu
28c20 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
28c30 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
28c40 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65  e, or.**   * The
28c50 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
28c60 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  E flag is set on
28c70 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
28c80 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20   If writing out 
28c90 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68  a page causes th
28ca0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28cb0 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64  to grow, Pager.d
28cc0 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20  bFileSize.** is 
28cd0 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e  updated accordin
28ce0 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69  gly. If page 1 i
28cf0 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74  s written out, t
28d00 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61  hen the value ca
28d10 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72  ched.** in Pager
28d20 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
28d30 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63   updated to matc
28d40 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  h the new value 
28d50 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65  stored in.** the
28d60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
28d70 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
28d80 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
28d90 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
28da0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
28db0 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
28dc0 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
28dd0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
28de0 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58  d. Or, if the EX
28df0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e  CLUSIVE lock can
28e00 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e  not.** be obtain
28e10 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ed, SQLITE_BUSY 
28e20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
28e30 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
28e40 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
28e50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
28e60 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
28e70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28e80 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
28e90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
28ea0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
28eb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
28ec0 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f  ly called for ro
28ed0 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e  llback pagers in
28ee0 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74   WRITER_DBMOD st
28ef0 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ate. */.  assert
28f00 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
28f10 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
28f20 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
28f30 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
28f40 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  _DBMOD );.  asse
28f50 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
28f60 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
28f70 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
28f80 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
28f90 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
28fa0 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
28fb0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
28fc0 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
28fd0 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
28fe0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
28ff0 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
29000 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
29010 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
29020 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
29030 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
29040 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
29050 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
29060 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
29070 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
29080 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
29090 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
290a0 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
290b0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
290c0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
290d0 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
290e0 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72  * Before the fir
290f0 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74  st write, give t
29100 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66  he VFS a hint of
29110 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a   what the final.
29120 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77    ** file size w
29130 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61  ill be..  */.  a
29140 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
29150 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
29160 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
29170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29180 4b 20 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d  K .   && (pList-
29190 3e 70 44 69 72 74 79 20 3f 20 70 50 61 67 65 72  >pDirty ? pPager
291a0 2d 3e 64 62 53 69 7a 65 20 3a 20 70 4c 69 73 74  ->dbSize : pList
291b0 2d 3e 70 67 6e 6f 2b 31 29 3e 70 50 61 67 65 72  ->pgno+1)>pPager
291c0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 0a 20 20  ->dbHintSize .  
291d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
291e0 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50  nt64 szFile = pP
291f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a  ager->pageSize *
29200 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
29210 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
29220 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
29230 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
29240 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
29250 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
29260 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70   &szFile);.    p
29270 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
29280 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
29290 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ze;.  }..  while
292a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
292b0 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
292c0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
292d0 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
292e0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
292f0 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
29300 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
29310 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
29320 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
29330 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
29340 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
29350 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
29360 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
29370 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
29380 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
29390 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
293a0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
293b0 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
293c0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
293d0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
293e0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
293f0 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
29400 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
29410 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
29420 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
29430 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
29440 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
29450 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
29460 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29470 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
29480 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
29490 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
294a0 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
294b0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
294c0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
294d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
294e0 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
294f0 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
29500 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29530 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
29540 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73  */    ..      as
29550 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c  sert( (pList->fl
29560 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
29570 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
29580 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
29590 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
295a0 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
295b0 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pList);..      /
295c0 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74  * Encode the dat
295d0 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
295e0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
295f0 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  ist->pData, pgno
29600 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 6, return SQLI
29610 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29  TE_NOMEM, pData)
29620 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
29630 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
29640 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
29650 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
29660 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
29670 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
29680 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
29690 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
296a0 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
296b0 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
296c0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
296d0 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
296e0 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
296f0 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
29700 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
29710 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
29720 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
29730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29740 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
29750 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
29760 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
29770 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
29780 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
29790 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
297a0 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
297b0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
297c0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
297d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
297e0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
297f0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
29800 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
29810 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
29820 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
29830 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
29840 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20  T_WRITE]++;..   
29850 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
29860 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
29870 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
29880 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
29890 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
298a0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
298b0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
298c0 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
298d0 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
298e0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
298f0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
29900 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
29910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29920 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
29930 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
29940 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
29950 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
29960 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
29970 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
29980 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
29990 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
299a0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
299b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
299c0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
299d0 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
299e0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
299f0 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
29a00 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
29a10 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
29a20 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
29a30 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
29a40 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
29a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
29a60 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
29a70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
29a80 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
29a90 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
29aa0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
29ab0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
29ac0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
29ad0 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
29ae0 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
29af0 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
29b00 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
29b10 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
29b20 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
29b30 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
29b40 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
29b50 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
29b60 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
29b70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
29b80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29b90 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
29ba0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
29bb0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
29bc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
29bd0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
29be0 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
29bf0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
29c00 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
29c10 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
29c20 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
29c30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29c40 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
29c50 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
29c60 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
29c70 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
29c80 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
29c90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29ca0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
29cb0 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
29cc0 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
29cd0 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
29ce0 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
29cf0 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
29d00 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
29d10 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
29d20 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
29d30 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
29d40 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
29d50 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
29d60 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
29d70 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
29d80 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
29d90 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
29da0 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
29db0 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
29dc0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
29dd0 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
29de0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
29df0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
29e00 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
29e10 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
29e20 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
29e30 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
29e40 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
29e50 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
29e60 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
29e70 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
29e80 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
29e90 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
29ea0 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
29eb0 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
29ec0 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
29ed0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
29ee0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
29ef0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
29f00 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
29f10 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
29f20 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
29f30 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
29f40 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
29f50 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
29f60 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
29f70 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
29f80 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
29f90 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
29fa0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
29fb0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
29fc0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
29fd0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
29fe0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
29ff0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2a000 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2a010 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
2a020 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
2a030 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
2a040 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
2a050 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
2a060 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a  InJournal(pPg) .
2a070 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d           || pPg-
2a080 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
2a090 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b  OrigSize .    );
2a0a0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
2a0b0 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
2a0c0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2a0d0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   sub-journal was
2a0e0 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66   opened successf
2a0f0 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72  ully (or was alr
2a100 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20  eady open),.    
2a110 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  ** write the jou
2a120 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f  rnal record into
2a130 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20   the file.  */. 
2a140 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f  E_OK ){.      vo
2a160 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
2a170 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36  >pData;.      i6
2a180 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
2a190 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a  pPager->nSubRec*
2a1a0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
2a1b0 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ize);.      char
2a1c0 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20   *pData2;.  .   
2a1d0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
2a1e0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
2a1f0 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
2a200 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
2a210 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  a2);.      PAGER
2a220 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
2a230 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
2a240 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2a250 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
2a260 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
2a270 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
2a280 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
2a290 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
2a2a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a2b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2a2c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2a2d0 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
2a2e0 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
2a2f0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
2a300 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +4);.      }.   
2a310 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
2a320 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a330 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
2a340 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
2a350 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2a360 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
2a370 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
2a380 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
2a390 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
2a3a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a3b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2a3c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
2a3d0 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
2a3e0 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
2a3f0 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
2a400 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
2a410 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
2a420 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
2a430 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
2a440 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
2a450 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
2a460 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
2a470 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
2a480 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
2a490 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
2a4a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
2a4b0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
2a4c0 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
2a4d0 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
2a4e0 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
2a4f0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2a500 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
2a510 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
2a520 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
2a530 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
2a540 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
2a550 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
2a560 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
2a570 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a580 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
2a590 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
2a5a0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
2a5b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2a5c0 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
2a5d0 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
2a5e0 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
2a5f0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2a600 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
2a610 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
2a620 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2a630 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
2a640 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
2a650 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2a660 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2a670 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
2a680 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
2a690 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
2a6a0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2a6b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
2a6c0 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
2a6d0 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
2a6e0 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
2a6f0 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
2a700 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
2a710 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
2a720 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
2a730 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2a740 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
2a750 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
2a760 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
2a770 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
2a780 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
2a790 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
2a7a0 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
2a7b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2a7c0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
2a7d0 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
2a7e0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
2a7f0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
2a800 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
2a810 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20  tSyncSpill flag 
2a820 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69  is set during ti
2a830 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61  mes when doing a
2a840 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f   sync of.  ** jo
2a850 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e  urnal (and addin
2a860 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20  g a new header) 
2a870 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20  is not allowed. 
2a880 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a   This occurs.  *
2a890 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74  * during calls t
2a8a0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
2a8b0 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69  ite() while tryi
2a8c0 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75  ng to journal mu
2a8d0 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65  ltiple.  ** page
2a8e0 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
2a8f0 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a  he same sector..
2a900 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f    **.  ** The do
2a910 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e  NotSpill flag in
2a920 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65  hibits all cache
2a930 20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61 72 64   spilling regard
2a940 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 0a  less of whether.
2a950 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79    ** or not a sy
2a960 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
2a970 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72   This is set dur
2a980 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
2a990 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
2a9a0 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
2a9b0 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
2a9c0 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
2a9d0 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
2a9e0 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
2a9f0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
2aa00 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
2aa10 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69   implementaton i
2aa20 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73  t .  ** is impos
2aa30 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  sible for sqlite
2aa40 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74  3PcacheFetch() t
2aa50 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  o be called with
2aa60 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20   createFlag==1. 
2aa70 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65   ** while in the
2aa80 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65   error state, he
2aa90 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73  nce it is imposs
2aaa0 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
2aab0 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65  utine to.  ** be
2aac0 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65   called in the e
2aad0 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76  rror state.  Nev
2aae0 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e  ertheless, we in
2aaf0 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a  clude a NEVER().
2ab00 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68    ** test for th
2ab10 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73  e error state as
2ab20 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61   a safeguard aga
2ab30 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e  inst future chan
2ab40 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ges..  */.  if( 
2ab50 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
2ab60 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
2ab70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
2ab80 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2ab90 69 6c 6c 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ill ) return SQL
2aba0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
2abb0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
2abc0 70 69 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c  pill && (pPg->fl
2abd0 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
2abe0 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20  _SYNC)!=0 ){.   
2abf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ac00 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70  K;.  }..  pPg->p
2ac10 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28  Dirty = 0;.  if(
2ac20 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2ac30 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ger) ){.    /* W
2ac40 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72  rite a single fr
2ac50 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ame for this pag
2ac60 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f  e to the log. */
2ac70 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71  .    if( subjReq
2ac80 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2ac90 7b 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  { .      rc = su
2aca0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
2acb0 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ); .    }.    if
2acc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2acd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
2ace0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
2acf0 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b  ger, pPg, 0, 0);
2ad00 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2ad10 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
2ad20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ad30 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2ad40 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
2ad50 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2ad60 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  NC .     || pPag
2ad70 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2ad80 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
2ad90 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  D.    ){.      r
2ada0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
2adb0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2adc0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
2add0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2ade0 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c  f this page is l
2adf0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63  arger than the c
2ae00 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20  urrent size of. 
2ae10 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2ae20 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79  se image, it may
2ae30 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74   need to be writ
2ae40 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
2ae50 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54  ournal..    ** T
2ae60 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
2ae70 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  he call to pager
2ae80 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
2ae90 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74  ) below will not
2aea0 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79  .    ** actually
2aeb0 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74   write data to t
2aec0 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  he file in this 
2aed0 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  case..    **.   
2aee0 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65   ** Consider the
2aef0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65   following seque
2af00 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20  nce of events:. 
2af10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42     **.    **   B
2af20 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20  EGIN;.    **    
2af30 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
2af40 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f  >.    **     <mo
2af50 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20  dify page X>.   
2af60 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e   **     SAVEPOIN
2af70 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20  T sp;.    **    
2af80 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62     <shrink datab
2af90 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61  ase file to Y pa
2afa0 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  ges>.    **     
2afb0 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61    pagerStress(pa
2afc0 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20  ge X).    **    
2afd0 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b   ROLLBACK TO sp;
2afe0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2aff0 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68  f (X>Y), then wh
2b000 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69  en pagerStress i
2b010 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20  s called page X 
2b020 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
2b030 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74  ten.    ** out t
2b040 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2b050 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65  ile, but will be
2b060 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68   dropped from th
2b070 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20  e cache. Then,. 
2b080 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
2b090 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
2b0a0 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20   sp" statement, 
2b0b0 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77  reading page X w
2b0c0 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20  ill read.    ** 
2b0d0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61  data from the da
2b0e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
2b0f0 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  s will be the co
2b100 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20  py of page X as 
2b110 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68  it.    ** was wh
2b120 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
2b130 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20  on started, not 
2b140 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22  as it was when "
2b150 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20  SAVEPOINT sp".  
2b160 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65    ** was execute
2b170 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
2b180 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
2b190 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
2b1a0 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70  rrent data for p
2b1b0 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a  age X into the .
2b1c0 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e      ** sub-journ
2b1d0 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20  al file now (if 
2b1e0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
2b1f0 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61  y there), so tha
2b200 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  t it will.    **
2b210 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
2b220 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
2b230 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c  e when the "ROLL
2b240 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a  BACK TO sp" is .
2b250 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e      ** executed.
2b260 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2b270 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20 20 72  NEVER(.        r
2b280 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b290 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
2b2a0 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a  ->dbSize && subj
2b2b0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2b2c0 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20  ).    ) ){.     
2b2d0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
2b2e0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
2b2f0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
2b300 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2b310 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
2b320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b330 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
2b340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2b360 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2b370 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2b380 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2b390 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2b3a0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
2b3b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
2b3c0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
2b3d0 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
2b3e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b3f0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2b400 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
2b410 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2b420 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2b430 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
2b440 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2b450 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
2b460 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
2b470 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
2b480 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
2b490 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2b4a0 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
2b4b0 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
2b4c0 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
2b4d0 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
2b4e0 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
2b4f0 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
2b500 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
2b510 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
2b520 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
2b530 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
2b540 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
2b550 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
2b560 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
2b570 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
2b580 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
2b590 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
2b5a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2b5b0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
2b5c0 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
2b5d0 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
2b5e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
2b5f0 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
2b600 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
2b610 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
2b620 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
2b630 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
2b640 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
2b650 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
2b660 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
2b670 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
2b680 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
2b690 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2b6a0 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
2b6b0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2b6c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
2b6d0 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
2b6e0 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
2b6f0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
2b700 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
2b710 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
2b720 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
2b730 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
2b740 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
2b750 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
2b760 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
2b770 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
2b780 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
2b790 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
2b7a0 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
2b7b0 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
2b7c0 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
2b7d0 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
2b7e0 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
2b7f0 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
2b800 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
2b810 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  the PAGER_* flag
2b820 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
2b830 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
2b840 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
2b850 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
2b860 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
2b870 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
2b880 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
2b890 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
2b8a0 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
2b8b0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
2b8c0 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
2b8d0 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
2b8e0 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
2b8f0 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
2b900 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
2b910 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
2b920 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
2b930 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
2b940 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
2b950 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2b960 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
2b970 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
2b980 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
2b990 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
2b9a0 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
2b9b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
2b9c0 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
2b9d0 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
2b9e0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
2b9f0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2ba00 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
2ba10 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
2ba20 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
2ba30 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
2ba40 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2ba50 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
2ba60 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
2ba70 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
2ba80 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
2ba90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2baa0 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
2bab0 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
2bac0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2bad0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
2bae0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2baf0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
2bb00 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
2bb10 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
2bb20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
2bb30 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
2bb40 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2bb50 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bb70 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
2bb80 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
2bb90 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20   int vfsFlags,  
2bba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
2bbb0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
2bbc0 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
2bbd0 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f  .xOpen() */.  vo
2bbe0 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
2bbf0 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69  Page*) /* Functi
2bc00 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69  on to reinitiali
2bc10 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  ze pages */.){. 
2bc20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
2bc30 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
2bc40 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
2bc50 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
2bc60 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
2bc70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2bc80 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
2bc90 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2bca0 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
2bcb0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bcc0 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
2bcd0 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
2bce0 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
2bcf0 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
2bd00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2bd10 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
2bd20 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
2bd30 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
2bd40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bd50 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
2bd60 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
2bd70 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
2bd80 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
2bd90 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
2bda0 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2bdb0 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
2bdc0 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
2bdd0 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
2bde0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2bdf0 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
2be00 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
2be10 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2be20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
2be30 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
2be40 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
2be50 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
2be60 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
2be70 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
2be80 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65    int pcacheSize
2be90 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2bea0 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a  Size();       /*
2beb0 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
2bec0 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f  te for PCache */
2bed0 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c  .  u32 szPageDfl
2bee0 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2bef0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f  LT_PAGE_SIZE;  /
2bf00 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73  * Default page s
2bf10 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ize */.  const c
2bf20 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20  har *zUri = 0;  
2bf30 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f    /* URI args to
2bf40 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e   copy */.  int n
2bf50 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Uri = 0;        
2bf60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2bf70 20 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72   bytes of URI ar
2bf80 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a  gs at *zUri */..
2bf90 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
2bfa0 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
2bfb0 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65  s required for e
2bfc0 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ach journal file
2bfd0 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68  -handle.  ** (th
2bfe0 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74  ere are two of t
2bff0 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f  hem, the main jo
2c000 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75  urnal and the su
2c010 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73  b-journal). This
2c020 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78  .  ** is the max
2c030 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69  imum space requi
2c040 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  red for an in-me
2c050 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
2c060 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61  e handle .  ** a
2c070 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75  nd a regular jou
2c080 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
2c090 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72  . Note that a "r
2c0a0 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68  egular journal-h
2c0b0 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20  andle".  ** may 
2c0c0 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61 70  be a wrapper cap
2c0d0 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20  able of caching 
2c0e0 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f  the first portio
2c0f0 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
2c100 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65  .  ** file in me
2c110 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  mory to implemen
2c120 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
2c130 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2c140 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63  (see .  ** sourc
2c150 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63  e file journal.c
2c160 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  )..  */.  if( sq
2c170 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
2c180 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65  (pVfs)>sqlite3Me
2c190 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29  mJournalSize() )
2c1a0 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  {.    journalFil
2c1b0 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
2c1c0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
2c1d0 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73  e(pVfs));.  }els
2c1e0 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  e{.    journalFi
2c1f0 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
2c200 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
2c210 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20  lSize());.  }.. 
2c220 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70   /* Set the outp
2c230 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e  ut variable to N
2c240 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65  ULL in case an e
2c250 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
2c260 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
2c270 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c280 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
2c290 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45  if( flags & PAGE
2c2a0 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  R_MEMORY ){.    
2c2b0 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69  memDb = 1;.    i
2c2c0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
2c2d0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
2c2e0 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20        zPathname 
2c2f0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2c300 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  p(0, zFilename);
2c310 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68  .      if( zPath
2c320 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72  name==0  ) retur
2c330 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2c340 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20        nPathname 
2c350 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2c360 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
2c370 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
2c380 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
2c390 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  dif..  /* Comput
2c3a0 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
2c3b0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e  full pathname in
2c3c0 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75   an allocated bu
2c3d0 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a  ffer pointed.  *
2c3e0 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d  * to by zPathnam
2c3f0 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e  e, length nPathn
2c400 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73  ame. Or, if this
2c410 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2c420 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65  file,.  ** leave
2c430 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20   both nPathname 
2c440 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65  and zPathname se
2c450 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  t to 0..  */.  i
2c460 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
2c470 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
2c480 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2c490 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  z;.    nPathname
2c4a0 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
2c4b0 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68  ame+1;.    zPath
2c4c0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  name = sqlite3Db
2c4d0 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61  MallocRaw(0, nPa
2c4e0 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69  thname*2);.    i
2c4f0 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
2c500 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2c510 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2c520 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d    }.    zPathnam
2c530 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
2c540 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
2c550 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
2c560 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
2c570 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2c580 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
2c590 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
2c5a0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
2c5b0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50  athname);.    nP
2c5c0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2c5d0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2c5e0 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55  ame);.    z = zU
2c5f0 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b  ri = &zFilename[
2c600 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2c610 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20  zFilename)+1];. 
2c620 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
2c630 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2c640 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2c650 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2c660 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2c670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69  ;.    }.    nUri
2c680 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d   = (int)(&z[1] -
2c690 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65   zUri);.    asse
2c6a0 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20  rt( nUri>=0 );. 
2c6b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c6c0 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
2c6d0 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
2c6e0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
2c6f0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2c700 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
2c710 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
2c720 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
2c730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2c740 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
2c750 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
2c760 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
2c770 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
2c780 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
2c790 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
2c7a0 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
2c7b0 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
2c7c0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
2c7d0 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
2c7e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
2c7f0 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
2c800 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
2c810 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
2c820 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
2c830 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2c840 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2c850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
2c880 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2c890 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
2c8a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
2c8b0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
2c8c0 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
2c8d0 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
2c8e0 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
2c8f0 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
2c900 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
2c910 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2c920 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
2c930 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
2c940 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
2c950 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
2c960 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
2c970 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
2c980 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2c990 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
2c9a0 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
2c9b0 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
2c9c0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2c9d0 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
2c9e0 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
2c9f0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2ca00 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
2ca10 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
2ca20 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
2ca30 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
2ca40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2ca50 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
2ca60 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2ca70 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
2ca80 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
2ca90 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
2caa0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2cab0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2cac0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2cae0 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
2caf0 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
2cb00 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
2cb10 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2cb20 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
2cb30 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
2cb40 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
2cb50 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
2cb60 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2cb70 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
2cb80 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
2cb90 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
2cba0 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
2cbb0 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
2cbc0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
2cbd0 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2cbe0 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
2cbf0 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
2cc00 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
2cc10 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
2cc20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
2cc30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2cc40 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
2cc50 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20  + 1 + nUri +    
2cc60 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
2cc70 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
2cc80 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20  me + 8 + 2      
2cc90 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
2cca0 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nal */.#ifndef S
2ccb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2ccc0 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b     + nPathname +
2ccd0 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20   4 + 2          
2cce0 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e    /* zWal */.#en
2ccf0 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  dif.  );.  asser
2cd00 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2cd10 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
2cd20 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
2cd30 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
2cd40 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
2cd50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2cd60 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2cd70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cd80 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50  _NOMEM;.  }.  pP
2cd90 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20  ager =          
2cda0 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74      (Pager*)(pPt
2cdb0 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50  r);.  pPager->pP
2cdc0 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63  Cache =    (PCac
2cdd0 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  he*)(pPtr += ROU
2cde0 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2cdf0 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  er)));.  pPager-
2ce00 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33  >fd =   (sqlite3
2ce10 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2ce20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2ce30 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  e));.  pPager->s
2ce40 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
2ce50 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2ce60 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2ce70 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile));.  pPager-
2ce80 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33  >jfd =  (sqlite3
2ce90 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2cea0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2ceb0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
2cec0 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72  ename =    (char
2ced0 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2cee0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61  alFileSize);.  a
2cef0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
2cf00 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67  E_ALIGNMENT(pPag
2cf10 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  er->jfd) );..  /
2cf20 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61  * Fill in the Pa
2cf30 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e  ger.zFilename an
2cf40 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
2cf50 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71   buffers, if req
2cf60 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
2cf70 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
2cf80 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61   assert( nPathna
2cf90 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67  me>0 );.    pPag
2cfa0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
2cfb0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2cfc0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2cfd0 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2cfe0 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
2cff0 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
2d000 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2d010 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63   if( nUri ) memc
2d020 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c  py(&pPager->zFil
2d030 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
2d040 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  1], zUri, nUri);
2d050 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2d060 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50  er->zJournal, zP
2d070 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2d080 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2d090 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2d0a0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2d0b0 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b  journal\000", 8+
2d0c0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  2);.    sqlite3F
2d0d0 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2d0e0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2d0f0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
2d100 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d110 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61  OMIT_WAL.    pPa
2d120 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61  ger->zWal = &pPa
2d130 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2d140 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20  athname+8+1];.  
2d150 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2d160 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  >zWal, zPathname
2d170 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2d180 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2d190 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ->zWal[nPathname
2d1a0 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34  ], "-wal\000", 4
2d1b0 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
2d1c0 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67  FileSuffix3(pPag
2d1d0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2d1e0 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65  Pager->zWal);.#e
2d1f0 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
2d200 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2d210 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
2d220 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
2d230 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
2d240 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
2d250 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
2d260 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
2d270 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2d280 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2d290 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
2d2a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2d2b0 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
2d2c0 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2d2d0 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
2d2e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2d2f0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2d300 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2d310 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
2d320 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73  , &fout);.    as
2d330 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a  sert( !memDb );.
2d340 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2d350 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2d360 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
2d370 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2d380 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2d390 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
2d3a0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
2d3b0 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
2d3c0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2d3d0 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
2d3e0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
2d3f0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
2d400 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
2d410 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
2d420 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
2d430 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
2d440 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2d450 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
2d460 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
2d470 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2d480 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
2d490 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
2d4a0 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
2d4b0 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
2d4c0 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
2d4d0 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
2d4e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d4f0 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29  K && !readOnly )
2d500 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  {.      setSecto
2d510 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
2d520 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2d530 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2d540 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
2d550 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d560 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ZE);.      if( s
2d570 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
2d580 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
2d590 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2d5a0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
2d5b0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2d5c0 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
2d5d0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2d5e0 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
2d5f0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d600 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ZE;.        }els
2d610 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  e{.          szP
2d620 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70  ageDflt = (u32)p
2d630 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2d640 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2d650 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2d660 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2d670 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20  _WRITE.      {. 
2d680 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
2d690 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
2d6a0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
2d6b0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2d6c0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
2d6d0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2d6e0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
2d6f0 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
2d700 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2d710 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2d720 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
2d730 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2d740 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
2d750 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2d760 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
2d770 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
2d780 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
2d790 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2d7a0 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
2d7b0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
2d7c0 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
2d7d0 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
2d7e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
2d7f0 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
2d800 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d810 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
2d820 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  dif.    }.  }els
2d830 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
2d840 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2d850 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
2d860 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
2d870 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
2d880 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
2d890 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
2d8a0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
2d8b0 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
2d8c0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
2d8d0 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
2d8e0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
2d8f0 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
2d900 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2d910 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
2d920 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
2d930 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
2d940 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
2d950 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
2d960 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
2d970 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
2d980 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
2d990 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
2d9a0 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
2d9b0 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
2d9c0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  rnal..    */ .  
2d9d0 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
2d9e0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2d9f0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2da00 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  R;.    pPager->e
2da10 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45  Lock = EXCLUSIVE
2da20 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f  _LOCK;.    readO
2da30 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
2da40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2da50 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
2da60 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2da70 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
2da80 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
2da90 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
2daa0 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
2dab0 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
2dac0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
2dad0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
2dae0 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
2daf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2db00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2db10 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
2db20 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2db30 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
2db40 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
2db50 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
2db60 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
2db70 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
2db80 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
2db90 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69  r occurred in ei
2dba0 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63  ther of the bloc
2dbb0 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ks above, free t
2dbc0 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73  he .  ** Pager s
2dbd0 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
2dbe0 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
2dbf0 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
2dc00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2dc10 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54  ert( !pPager->pT
2dc20 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73  mpSpace );.    s
2dc30 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
2dc40 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
2dc50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
2dc60 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
2dc70 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  rc;.  }..  /* In
2dc80 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61  itialize the PCa
2dc90 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  che object. */. 
2dca0 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c   assert( nExtra<
2dcb0 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61  1000 );.  nExtra
2dcc0 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
2dcd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
2dce0 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
2dcf0 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
2dd00 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2dd10 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61         !memDb?pa
2dd20 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f  gerStress:0, (vo
2dd30 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61  id *)pPager, pPa
2dd40 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
2dd50 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
2dd60 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
2dd70 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
2dd80 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
2dd90 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
2dda0 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
2ddb0 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
2ddc0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2ddd0 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
2dde0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
2ddf0 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a  useJournal;.  /*
2de00 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
2de10 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
2de20 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
2de30 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2de40 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
2de50 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2de60 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
2de70 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2de80 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
2de90 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
2dea0 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
2deb0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
2dec0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
2ded0 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
2dee0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2def0 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30  UNLOCK; */.#if 0
2df00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2df10 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d  r->state == (tem
2df20 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58  pFile ? PAGER_EX
2df30 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f  CLUSIVE : PAGER_
2df40 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69  UNLOCK) );.#endi
2df50 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  f.  /* pPager->e
2df60 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2df70 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2df80 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2df90 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2dfa0 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2dfb0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2dfc0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2dfd0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2dfe0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2dff0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2e000 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e010 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2e020 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2e030 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2e040 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
2e050 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2e060 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
2e070 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2e080 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
2e090 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
2e0a0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
2e0b0 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
2e0c0 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
2e0d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e0e0 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
2e0f0 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
2e100 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
2e110 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
2e120 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2e130 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d  ager->fullSync==
2e140 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2e150 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2e160 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2e170 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c  ert( pPager->wal
2e180 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2e190 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e1a0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2e1b0 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  s==0 );.  }else{
2e1c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
2e1d0 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  lSync = 1;.    p
2e1e0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2e1f0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2e200 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
2e210 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
2e220 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2e230 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f  RMAL | WAL_SYNC_
2e240 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20  TRANSACTIONS;.  
2e250 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
2e260 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2e270 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2e280 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
2e290 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
2e2a0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2e2b0 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
2e2c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
2e2d0 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
2e2e0 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
2e2f0 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
2e300 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
2e310 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
2e320 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
2e330 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
2e340 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2e350 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
2e360 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
2e370 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2e380 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
2e390 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
2e3a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2e3b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2e3c0 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
2e3d0 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
2e3e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2e3f0 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2e400 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
2e410 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2e420 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
2e430 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e440 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
2e450 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
2e460 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
2e470 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
2e480 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
2e490 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
2e4a0 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
2e4b0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6d  /.  /* pPager->m
2e4c0 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  xMmap = SQLITE_D
2e4d0 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 4c 49 4d 49  EFAULT_MMAP_LIMI
2e4e0 54 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74  T // will be set
2e4f0 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a   by btree.c */..
2e500 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
2e510 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
2e520 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a  LITE_OK;.}..../*
2e530 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2e540 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
2e550 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
2e560 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
2e570 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
2e580 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
2e590 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
2e5a0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
2e5b0 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
2e5c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2e5d0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
2e5e0 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
2e5f0 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
2e600 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
2e610 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
2e620 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
2e630 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
2e640 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
2e650 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
2e660 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
2e670 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
2e680 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2e690 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
2e6a0 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
2e6b0 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
2e6c0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2e6d0 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
2e6e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2e6f0 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
2e700 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2e710 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
2e720 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
2e730 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
2e740 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
2e750 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
2e760 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2e770 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
2e780 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
2e790 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
2e7a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e7b0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
2e7c0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
2e7d0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
2e7e0 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
2e7f0 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
2e800 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
2e810 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
2e820 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
2e830 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
2e840 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
2e850 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
2e860 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
2e870 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2e880 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
2e890 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
2e8a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2e8b0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
2e8c0 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
2e8d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2e8e0 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
2e8f0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
2e900 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
2e910 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
2e920 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2e930 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2e940 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
2e950 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2e960 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
2e970 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
2e980 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
2e990 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2e9a0 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
2e9b0 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
2e9c0 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
2e9d0 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
2e9e0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
2e9f0 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
2ea00 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
2ea10 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
2ea20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
2ea30 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
2ea40 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
2ea50 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
2ea60 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
2ea70 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
2ea80 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2ea90 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
2eaa0 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
2eab0 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2eac0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2ead0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2eae0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
2eaf0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
2eb00 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2eb10 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2eb20 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
2eb30 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
2eb40 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
2eb50 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
2eb60 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
2eb70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2eb80 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
2eb90 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2eba0 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
2ebb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2ebc0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2ebd0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
2ebe0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2ebf0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2ec00 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2ec10 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20  exists = 1;     
2ec20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2ec30 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
2ec40 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
2ec50 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e  /.  int jrnlOpen
2ec60 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67   = !!isOpen(pPag
2ec70 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73  er->jfd);..  ass
2ec80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2ec90 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
2eca0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2ecb0 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
2ecc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2ecd0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2ece0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72  );..  assert( jr
2ecf0 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73  nlOpen==0 || ( s
2ed00 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2ed10 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2ed20 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20  ager->jfd) &.   
2ed30 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
2ed40 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
2ed50 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45  PEN.  ));..  *pE
2ed60 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28  xists = 0;.  if(
2ed70 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2ed80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2ed90 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
2eda0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
2edb0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2edc0 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
2edd0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2ede0 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
2edf0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b   ){.    int lock
2ee00 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
2ee10 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
2ee20 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  ome process hold
2ee30 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
2ee40 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63  k */..    /* Rac
2ee50 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65  e condition here
2ee60 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65  :  Another proce
2ee70 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ss might have be
2ee80 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  en holding the. 
2ee90 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56     ** the RESERV
2eea0 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65  ED lock and have
2eeb0 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20   a journal open 
2eec0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  at the sqlite3Os
2eed0 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a  Access() .    **
2eee0 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74   call above, but
2eef0 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
2ef00 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f   journal and dro
2ef10 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72  p the lock befor
2ef20 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20  e.    ** we get 
2ef30 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2ef40 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2ef50 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61  eservedLock() ca
2ef60 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20  ll.  If that.   
2ef70 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c   ** is the case,
2ef80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
2ef90 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20  ght think there 
2efa0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
2efb0 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20   when.    ** in 
2efc0 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f  fact there is no
2efd0 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74  ne.  This result
2efe0 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  s in a false-pos
2eff0 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c  itive which will
2f000 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  .    ** be dealt
2f010 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61   with by the pla
2f020 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20  yback routine.  
2f030 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20  Ticket #3883..  
2f040 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2f050 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2f060 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
2f070 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20  >fd, &locked);. 
2f080 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f090 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20  E_OK && !locked 
2f0a0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  ){.      Pgno nP
2f0b0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2f0c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f0d0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
2f0e0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
2f0f0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20     /* Check the 
2f100 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2f110 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74  base file. If it
2f120 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70   consists of 0 p
2f130 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74  ages,.      ** t
2f140 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
2f150 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65  ournal file. See
2f160 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
2f170 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20  ent above for . 
2f180 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73       ** the reas
2f190 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c  oning here.  Del
2f1a0 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65  ete the obsolete
2f1b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e   journal file un
2f1c0 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52  der.      ** a R
2f1d0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
2f1e0 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69  avoid race condi
2f1f0 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f  tions and to avo
2f200 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20  id violating.   
2f210 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a     ** [H33020]..
2f220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2f230 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
2f240 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
2f250 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2f260 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f270 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
2f280 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2f290 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
2f2a0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
2f2b0 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
2f2c0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
2f2d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
2f2e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f2f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
2f300 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
2f310 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2f320 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2f330 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
2f340 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67  lusiveMode ) pag
2f350 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
2f360 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
2f370 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f380 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
2f390 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
2f3a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2f3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2f3c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2f3d0 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
2f3e0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
2f3f0 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
2f400 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
2f410 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
2f420 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
2f430 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
2f440 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
2f450 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
2f460 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
2f470 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2f480 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f490 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
2f4a0 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
2f4b0 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
2f4c0 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
2f4d0 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
2f4e0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
2f4f0 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
2f500 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f510 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
2f520 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2f530 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
2f540 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
2f550 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2f560 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
2f570 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f580 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2f590 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2f5a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
2f5b0 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &f);.          }
2f5c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2f5d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f5e0 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
2f5f0 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
2f600 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f610 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
2f620 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
2f630 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
2f640 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2f650 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
2f660 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
2f670 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2f680 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2f690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f6a0 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
2f6b0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2f6c0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2f6d0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
2f6e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f6f0 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
2f700 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b  ts = (first!=0);
2f710 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2f720 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f730 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
2f740 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
2f750 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65   cannot open the
2f760 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2f770 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  l file in order 
2f780 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20  to see if.      
2f790 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61 73        ** its has
2f7a0 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20   a zero header, 
2f7b0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75  that might be du
2f7c0 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f  e to an I/O erro
2f7d0 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  r, or.          
2f7e0 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
2f7f0 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65   due to the race
2f800 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
2f810 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69  ibed above and i
2f820 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
2f830 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20   ticket #3883.  
2f840 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75  Either way, assu
2f850 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  me that the jour
2f860 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20  nal is hot..    
2f870 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
2f880 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65  might be a false
2f890 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20   positive.  But 
2f8a0 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  if it is, then t
2f8b0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
2f8c0 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72  * automatic jour
2f8d0 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64  nal playback and
2f8e0 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e   recovery mechan
2f8f0 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20  ism will deal.  
2f900 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74            ** wit
2f910 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58  h it under an EX
2f920 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65  CLUSIVE lock whe
2f930 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  re we do not nee
2f940 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
2f950 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63   ** worry so muc
2f960 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64  h with race cond
2f970 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20  itions..        
2f980 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2f990 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
2f9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2f9b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2f9c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f9d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2f9e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2f9f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2fa00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2fa10 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
2fa20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
2fa30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fa40 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
2fa50 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
2fa60 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29  e3PagerAcquire()
2fa70 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69   until after thi
2fa80 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  s function.** ha
2fa90 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
2faa0 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61  lly called. If a
2fab0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
2fac0 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65  already held whe
2fad0 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
2fae0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
2faf0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2fb00 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2fb10 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
2fb20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62  also performed b
2fb30 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
2fb40 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74  .**.**   1) If t
2fb50 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
2fb60 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f  ently in PAGER_O
2fb70 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f  PEN state (no lo
2fb80 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20  ck held.**      
2fb90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2fba0 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61  file), then an a
2fbb0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
2fbc0 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20  o obtain a.**   
2fbd0 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f     SHARED lock o
2fbe0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2fbf0 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79  ile. Immediately
2fc00 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
2fc10 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41  .**      the SHA
2fc20 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69  RED lock, the fi
2fc30 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65  le-system is che
2fc40 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a  cked for a hot-j
2fc50 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20  ournal,.**      
2fc60 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20  which is played 
2fc70 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e  back if present.
2fc80 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68   Following any h
2fc90 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  ot-journal .**  
2fca0 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68      rollback, th
2fcb0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2fcc0 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69  e cache are vali
2fcd0 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e  dated by checkin
2fce0 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63  g.**      the 'c
2fcf0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66  hange-counter' f
2fd00 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61  ield of the data
2fd10 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
2fd20 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73   and.**      dis
2fd30 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61  carded if they a
2fd40 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69  re found to be i
2fd50 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  nvalid..**.**   
2fd60 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  2) If the pager 
2fd70 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
2fd80 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e  clusive-mode, an
2fd90 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  d there are curr
2fda0 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f  ently.**      no
2fdb0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2fdc0 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70  erences to any p
2fdd0 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20  ages, and is in 
2fde0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
2fdf0 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e  .**      then an
2fe00 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2fe10 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72   to clear the er
2fe20 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73  ror state by dis
2fe30 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  carding.**      
2fe40 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2fe50 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61  the page cache a
2fe60 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  nd rolling back 
2fe70 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  any open journal
2fe80 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a  .**      file..*
2fe90 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
2fea0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
2feb0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2fec0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2fed0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
2fee0 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
2fef0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
2ff00 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
2ff10 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  t-journal file o
2ff20 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61  r .** rolling ba
2ff30 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
2ff40 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
2ff50 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2ff60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ff70 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
2ff80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2ff90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ffa0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2ffb0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2ffc0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
2ffd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
2ffe0 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d  y called from b-
2fff0 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68  tree and only wh
30000 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  en there are no.
30010 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67    ** outstanding
30020 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70   pages. This imp
30030 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61  lies that the pa
30040 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64  ger state should
30050 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20   either.  ** be 
30060 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20  OPEN or READER. 
30070 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70  READER is only p
30080 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70  ossible if the p
30090 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69  ager is or was i
300a0 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76  n .  ** exclusiv
300b0 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20  e access mode.. 
300c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
300d0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
300e0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
300f0 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  che)==0 );.  ass
30100 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
30110 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
30120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30130 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30140 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
30150 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
30160 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28  _READER );.  if(
30170 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20   NEVER(MEMDB && 
30180 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
30190 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65   ){ return pPage
301a0 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20  r->errCode; }.. 
301b0 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
301c0 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
301d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
301e0 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69  ER_OPEN ){.    i
301f0 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  nt bHotJournal =
30200 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   1;          /* 
30210 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
30220 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ists a hot journ
30230 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  al-file */..    
30240 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
30250 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
30260 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
30270 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
30280 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
30290 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
302a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
302b0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
302c0 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
302d0 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
302e0 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
302f0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
30300 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
30310 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
30320 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
30330 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
30340 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
30350 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
30360 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
30370 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
30380 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
30390 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
303a0 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
303b0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
303c0 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
303d0 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
303e0 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
303f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
30400 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30410 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
30420 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
30430 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
30440 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
30450 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
30460 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
30470 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ONLY_ROLLBACK;. 
30480 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
30490 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
304a0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
304b0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
304c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
304d0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
304e0 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
304f0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
30500 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
30510 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
30520 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
30530 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
30540 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
30550 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
30560 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
30570 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
30580 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
30590 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
305a0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
305b0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
305c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
305d0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
305e0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
305f0 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
30600 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
30610 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
30620 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
30630 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
30640 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
30650 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
30660 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
30670 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
30680 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
30690 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
306a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
306b0 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
306c0 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
306d0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
306e0 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
306f0 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
30700 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
30710 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30720 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
30730 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
30740 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
30750 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
30760 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
30770 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
30780 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
30790 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
307a0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
307b0 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
307c0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
307d0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
307e0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
307f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
30800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30810 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
30820 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
30830 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
30840 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
30850 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
30860 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
30870 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
30880 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
30890 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
308a0 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
308b0 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
308c0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
308d0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
308e0 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
308f0 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
30900 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
30910 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
30920 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
30930 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
30940 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
30950 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
30960 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
30970 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
30980 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
30990 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
309a0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
309b0 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
309c0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
309d0 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
309e0 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
309f0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
30a00 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
30a10 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
30a20 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
30a30 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
30a40 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
30a50 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
30a60 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
30a70 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
30a80 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
30a90 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
30aa0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
30ab0 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
30ac0 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
30ad0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
30ae0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
30af0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
30b00 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
30b10 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
30b20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30b30 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
30b40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30b50 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
30b60 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
30b70 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
30b80 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
30b90 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
30ba0 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
30bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
30bc0 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
30bd0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
30be0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
30bf0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
30c00 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
30c10 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
30c20 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
30c30 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
30c40 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
30c50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
30c60 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
30c70 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
30c80 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
30c90 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
30ca0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
30cb0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
30cc0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
30cd0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
30ce0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
30cf0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30d00 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
30d10 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
30d20 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
30d30 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
30d40 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
30d50 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
30d60 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
30d70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
30d80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30d90 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
30da0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
30db0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30dc0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
30dd0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
30de0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
30df0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
30e00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30e10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
30e20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
30e30 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
30e40 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
30e50 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
30e60 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
30e70 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
30e80 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
30e90 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
30ea0 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
30eb0 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
30ec0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
30ed0 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
30ee0 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
30ef0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
30f00 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
30f10 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
30f20 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
30f30 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
30f40 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
30f50 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
30f60 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
30f70 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
30f80 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
30f90 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
30fa0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
30fb0 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
30fc0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
30fd0 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
30fe0 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
30ff0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
31000 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
31010 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
31020 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31030 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31040 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
31050 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
31060 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31080 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
31090 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
310a0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  1);.          pP
310b0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
310c0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
310d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
310e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
310f0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
31100 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
31110 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
31120 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
31130 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
31140 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31150 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
31160 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
31170 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
31180 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
31190 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
311a0 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
311b0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
311c0 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
311d0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
311e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
311f0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
31200 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
31210 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
31220 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
31230 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
31240 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
31250 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
31260 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
31270 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
31280 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
31290 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
312a0 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
312b0 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
312c0 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
312d0 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
312e0 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
312f0 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
31300 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
31310 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
31320 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
31330 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
31340 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
31350 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
31360 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
31370 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
31380 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
31390 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
313a0 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
313b0 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
313c0 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
313d0 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
313e0 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
313f0 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
31400 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
31410 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
31420 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
31430 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
31440 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
31450 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
31460 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
31470 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
31480 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
31490 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
314a0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
314b0 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
314c0 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
314d0 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
314e0 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
314f0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
31500 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
31510 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
31520 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
31530 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
31540 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
31550 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
31560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
31570 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
31580 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
31590 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
315a0 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
315b0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
315c0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
315d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
315e0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
315f0 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
31600 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
31610 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
31620 69 6c 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ile && (.       
31630 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
31640 20 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65   .     || sqlite
31650 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
31660 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
31670 29 3e 30 20 0a 20 20 20 20 20 7c 7c 20 55 53 45  )>0 .     || USE
31680 46 45 54 43 48 28 70 50 61 67 65 72 29 0a 20 20  FETCH(pPager).  
31690 20 20 29 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54    )){.      /* T
316a0 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
316b0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
316c0 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
316d0 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
316e0 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
316f0 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
31700 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
31710 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
31720 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
31730 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
31740 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
31750 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
31760 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65  .      ** has be
31770 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
31780 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
31790 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68  s changed, flush
317a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
317b0 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  che..      **.  
317c0 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
317d0 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
317e0 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
317f0 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
31800 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74  ning.      ** at
31810 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
31820 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
31830 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
31840 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
31850 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
31860 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
31870 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
31880 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
31890 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  e.      ** other
318a0 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
318b0 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
318c0 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
318d0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64  n.      ** a cod
318e0 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
318f0 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
31900 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
31910 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
31920 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
31930 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
31940 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
31950 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
31960 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
31970 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
31980 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ll that.      **
31990 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
319a0 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cted..      */. 
319b0 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20       Pgno nPage 
319c0 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
319d0 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
319e0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
319f0 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72  Vers)];..      r
31a00 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
31a10 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
31a20 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
31a30 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a   ) goto failed;.
31a40 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
31a50 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f  >0 ){.        IO
31a60 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25  TRACE(("CKVERS %
31a70 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
31a80 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
31a90 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rs)));.        r
31aa0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
31ab0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64  d(pPager->fd, &d
31ac0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
31ad0 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32  f(dbFileVers), 2
31ae0 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
31af0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
31b00 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
31b10 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
31b20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
31b30 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
31b40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31b50 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46        memset(dbF
31b60 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65  ileVers, 0, size
31b70 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
31b80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31b90 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65  if( memcmp(pPage
31ba0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
31bb0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
31bc0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d  f(dbFileVers))!=
31bd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  0 ){.        pag
31be0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
31bf0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;..        /* Un
31c00 6d 61 70 20 74 68 65 20 64 61 74 61 62 61 73 65  map the database
31c10 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f 73   file. It is pos
31c20 73 69 62 6c 65 20 74 68 61 74 20 65 78 74 65 72  sible that exter
31c30 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20 20  nal processes.  
31c40 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76        ** may hav
31c50 65 20 74 72 75 6e 63 61 74 65 64 20 74 68 65 20  e truncated the 
31c60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
31c70 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64 20  d then extended 
31c80 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20 20  it back.        
31c90 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ** to its origin
31ca0 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74 68  al size while th
31cb0 69 73 20 70 72 6f 63 65 73 73 20 77 61 73 20 6e  is process was n
31cc0 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63  ot holding a loc
31cd0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  k..        ** In
31ce0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
31cf0 20 6d 61 79 20 65 78 69 73 74 20 61 20 50 61 67   may exist a Pag
31d00 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67 20  er.pMap mapping 
31d10 74 68 61 74 20 61 70 70 65 61 72 73 0a 20 20 20  that appears.   
31d20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74 68       ** to be th
31d30 65 20 72 69 67 68 74 20 73 69 7a 65 20 62 75 74  e right size but
31d40 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
31d50 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74 68   valid. Avoid th
31d60 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  is.        ** po
31d70 73 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e 6d  ssibility by unm
31d80 61 70 70 69 6e 67 20 74 68 65 20 64 62 20 68 65  apping the db he
31d90 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  re. */.        i
31da0 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
31db0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
31dc0 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
31dd0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c  h(pPager->fd, 0,
31de0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
31df0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
31e00 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
31e10 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74   a WAL file in t
31e20 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
31e30 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61  open this databa
31e40 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a  se in WAL.    **
31e50 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   mode. Otherwise
31e60 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
31e70 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73  function call is
31e80 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f   a no-op..    */
31e90 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
31ea0 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
31eb0 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66  pPager);.#ifndef
31ec0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
31ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
31ee0 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20  ger->pWal==0 || 
31ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
31f00 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
31f10 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
31f20 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
31f30 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
31f40 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
31f50 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
31f60 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
31f70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  );.  }..  if( pP
31f80 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
31f90 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d  GER_OPEN && rc==
31fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31fb0 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
31fc0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50  ount(pPager, &pP
31fd0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
31fe0 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
31ff0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32000 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
32010 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
32020 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
32030 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
32040 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32050 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
32060 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
32070 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
32080 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20  R_READER;.  }.  
32090 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
320a0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
320b0 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
320c0 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
320d0 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
320e0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
320f0 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
32100 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
32110 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
32120 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
32130 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
32140 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
32150 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
32160 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
32170 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
32180 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
32190 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
321a0 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
321b0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
321c0 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
321d0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
321e0 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
321f0 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
32200 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26  ->nMmapOut==0 &&
32210 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
32220 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
32230 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a  pPCache)==0) ){.
32240 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
32250 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
32260 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
32270 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72   Acquire a refer
32280 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d  ence to page num
32290 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65  ber pgno in page
322a0 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65  r pPager (a page
322b0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61  .** reference ha
322c0 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e  s type DbPage*).
322d0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
322e0 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
322f0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
32300 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
32310 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
32320 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
32330 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
32340 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
32350 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
32360 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
32370 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
32380 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
32390 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
323a0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
323b0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
323c0 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
323d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
323e0 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
323f0 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
32400 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
32410 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
32420 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
32430 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
32440 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
32450 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
32460 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
32470 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
32480 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
32490 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
324a0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
324b0 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
324c0 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
324d0 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
324e0 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
324f0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
32500 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
32510 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
32520 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
32530 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
32540 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
32550 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
32560 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
32570 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
32580 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
32590 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
325a0 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
325b0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
325c0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
325d0 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65   if a .** non-ze
325e0 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ro value is pass
325f0 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74  ed as the noCont
32600 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e  ent parameter an
32610 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
32620 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
32630 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
32640 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
32650 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
32660 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
32670 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
32680 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
32690 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
326a0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
326b0 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
326c0 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
326d0 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
326e0 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
326f0 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
32700 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
32710 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
32720 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70  ccurs in two sep
32730 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a  erate scenarios:
32740 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e  .**.**   a) When
32750 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d   reading a free-
32760 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66  list leaf page f
32770 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
32780 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29  , and.**.**   b)
32790 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
327a0 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  t is being rolle
327b0 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65  d back and we ne
327c0 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20  ed to load.**   
327d0 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e     a new page in
327e0 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  to the cache to 
327f0 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  be filled with t
32800 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
32810 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
32820 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
32830 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
32840 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
32850 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
32860 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
32870 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
32880 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
32890 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
328a0 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
328b0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
328c0 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
328d0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
328e0 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
328f0 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
32900 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
32910 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
32920 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
32930 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
32940 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
32950 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
32960 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
32970 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
32980 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
32990 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
329a0 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
329b0 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
329c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
329d0 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
329e0 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
329f0 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
32a00 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
32a10 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
32a20 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
32a30 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
32a40 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
32a50 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
32a60 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
32a70 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
32a80 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
32a90 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
32aa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
32ab0 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
32ac0 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
32ad0 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
32ae0 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
32af0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
32b00 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
32b10 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
32b20 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
32b30 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
32b40 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
32b50 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
32b60 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
32b70 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
32b80 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
32b90 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
32ba0 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
32bb0 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
32bc0 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
32bd0 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
32be0 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
32bf0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
32c00 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
32c10 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
32c20 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
32c30 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
32c40 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
32c50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
32c60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
32c70 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
32c80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
32c90 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
32ca0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
32cb0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
32cc0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
32cd0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
32ce0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
32cf0 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
32d00 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
32d10 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
32d20 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
32d30 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
32d40 2f 2a 20 50 41 47 45 52 5f 41 43 51 55 49 52 45  /* PAGER_ACQUIRE
32d50 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  _XXX flags */.){
32d60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
32d70 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
32d80 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69  pPg = 0;.  u32 i
32d90 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  Frame = 0;      
32da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
32db0 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ame to read from
32dc0 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63   WAL file */.  c
32dd0 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  onst int noConte
32de0 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  nt = (flags & PA
32df0 47 45 52 5f 41 43 51 55 49 52 45 5f 4e 4f 43 4f  GER_ACQUIRE_NOCO
32e00 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74  NTENT);..  /* It
32e10 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74   is acceptable t
32e20 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c  o use a read-onl
32e30 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f  y (mmap) page fo
32e40 72 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70  r any page excep
32e50 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66  t.  ** page 1 if
32e60 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69   there is no wri
32e70 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
32e80 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49  pen or the ACQUI
32e90 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  RE_READONLY.  **
32ea0 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66   flag was specif
32eb0 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
32ec0 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61  r. And so long a
32ed0 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20  s the db is not 
32ee0 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
32ef0 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y or in-memory d
32f00 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
32f10 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b  onst int bMmapOk
32f20 20 3d 20 28 70 67 6e 6f 21 3d 31 20 26 26 20 55   = (pgno!=1 && U
32f30 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 0a  SEFETCH(pPager).
32f40 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
32f50 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
32f60 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DER || (flags & 
32f70 50 41 47 45 52 5f 41 43 51 55 49 52 45 5f 52 45  PAGER_ACQUIRE_RE
32f80 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20  ADONLY)).  );.. 
32f90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32fa0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
32fb0 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
32fc0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
32fd0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
32fe0 0a 20 20 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e  .  assert( noCon
32ff0 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70  tent==0 || bMmap
33000 4f 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  Ok==0 );..  if( 
33010 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
33020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
33030 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
33040 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
33050 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
33060 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20  r state, return 
33070 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61  an error immedia
33080 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  tely. .  ** Othe
33090 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74  rwise, request t
330a0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
330b0 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a   PCache layer. *
330c0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
330d0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
330e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
330f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
33100 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 69 66    }else{..    if
33110 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67  ( bMmapOk && pag
33120 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
33130 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
33140 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
33150 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
33160 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b   pgno, &iFrame);
33170 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
33180 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
33190 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
331a0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
331b0 28 20 69 46 72 61 6d 65 3d 3d 30 20 26 26 20 62  ( iFrame==0 && b
331c0 4d 6d 61 70 4f 6b 20 29 7b 0a 20 20 20 20 20 20  MmapOk ){.      
331d0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b  void *pData = 0;
331e0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
331f0 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67  ite3OsFetch(pPag
33200 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20  er->fd, .       
33210 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29     (i64)(pgno-1)
33220 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
33230 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ize, pPager->pag
33240 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20  eSize, &pData.  
33250 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66      );..      if
33260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33270 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  && pData ){.    
33280 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
33290 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41  eState>PAGER_REA
332a0 44 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  DER ){.         
332b0 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63   (void)sqlite3Pc
332c0 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
332d0 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
332e0 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20   0, &pPg);.     
332f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
33300 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
33310 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41       rc = pagerA
33320 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70 50  cquireMapPage(pP
33330 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74  ager, pgno, pDat
33340 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  a, &pPg);.      
33350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33360 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65     sqlite3OsUnfe
33370 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
33380 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50  (i64)(pgno-1)*pP
33390 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
333a0 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
333b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  }.        if( pP
333c0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  g ){.          a
333d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
333e0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
333f0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b    *ppPage = pPg;
33400 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
33410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
33420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33430 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33450 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
33460 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
33470 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
33480 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
33490 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
334a0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70  ache, pgno, 1, p
334b0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  pPage);.  }..  i
334c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
334d0 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
334e0 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  r the call to sq
334f0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
33500 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  () returned an e
33510 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20  rror or the.    
33520 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72  ** pager was alr
33530 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
33540 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
33550 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
33560 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65  alled..    ** Se
33570 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a  t pPg to 0 and j
33580 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70  ump to the excep
33590 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a  tion handler.  *
335a0 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  /.    pPg = 0;. 
335b0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
335c0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20  quire_err;.  }. 
335d0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
335e0 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
335f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
33600 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70  Page)->pPager==p
33610 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67  Pager || (*ppPag
33620 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b  e)->pPager==0 );
33630 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65  ..  if( (*ppPage
33640 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f  )->pPager && !no
33650 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f  Content ){.    /
33660 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
33670 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64  he pcache alread
33680 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  y contains an in
33690 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f  itialized copy o
336a0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  f.    ** the pag
336b0 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  e. Return withou
336c0 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20  t further ado.  
336d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
336e0 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50  gno<=PAGER_MAX_P
336f0 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47  GNO && pgno!=PAG
33700 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
33710 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  r) );.    pPager
33720 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
33730 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72  AT_HIT]++;.    r
33740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33750 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
33760 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68  * The pager cach
33770 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20  e has created a 
33780 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f  new page. Its co
33790 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a  ntent needs to .
337a0 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61      ** be initia
337b0 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20  lized.  */..    
337c0 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20  pPg = *ppPage;. 
337d0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
337e0 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a   pPager;..    /*
337f0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
33800 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
33810 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
33820 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67  CORRUPT if a pag
33830 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
33840 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
33850 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64  s, or the unused
33860 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69   locking-page, i
33870 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a  s requested. */.
33880 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47      if( pgno>PAG
33890 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
338a0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
338b0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
338c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
338d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
338e0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
338f0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
33900 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  }..    if( MEMDB
33910 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
33920 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e  ze<pgno || noCon
33930 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28  tent || !isOpen(
33940 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
33950 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
33960 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
33970 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
33980 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
33990 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
339a0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
339b0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
339c0 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
339d0 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
339e0 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
339f0 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
33a00 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
33a10 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
33a20 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
33a30 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
33a40 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
33a50 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
33a60 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
33a70 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
33a80 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
33a90 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
33aa0 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
33ab0 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
33ac0 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
33ad0 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
33ae0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
33af0 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
33b00 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
33b10 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
33b20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
33b30 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
33b40 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
33b50 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
33b60 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
33b70 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
33b80 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
33b90 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
33ba0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
33bb0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
33bc0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
33bd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
33be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33bf0 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
33c00 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
33c10 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
33c20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
33c30 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
33c40 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
33c50 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
33c60 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
33c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
33c80 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
33c90 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
33ca0 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  ize);.      IOTR
33cb0 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
33cc0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
33cd0 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
33ce0 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55        if( pagerU
33cf0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
33d00 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20   bMmapOk==0 ){. 
33d10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
33d20 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
33d30 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
33d40 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
33d50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33d60 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
33d70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
33d80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33d90 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
33da0 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
33db0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
33dc0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  at[PAGER_STAT_MI
33dd0 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20  SS]++;.      rc 
33de0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
33df0 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , iFrame);.     
33e00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33e10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
33e20 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
33e30 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
33e40 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
33e50 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
33e60 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
33e70 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
33e80 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
33e90 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
33ea0 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
33eb0 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
33ec0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
33ed0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
33ee0 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
33ef0 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
33f00 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
33f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
33f20 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
33f30 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
33f40 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
33f50 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
33f60 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
33f70 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
33f80 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
33f90 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
33fa0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
33fb0 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a   in cache. .**.*
33fc0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
33fd0 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
33fe0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
33ff0 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
34000 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
34010 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
34020 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
34030 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
34040 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
34050 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
34060 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
34070 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
34080 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
34090 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
340a0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
340b0 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
340c0 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
340d0 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
340e0 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
340f0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
34100 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
34110 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
34120 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
34130 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
34140 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
34150 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
34160 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
34170 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  ache!=0 );.  ass
34180 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
34190 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
341a0 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
341b0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
341c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   );.  sqlite3Pca
341d0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
341e0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
341f0 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75  0, &pPg);.  retu
34200 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
34210 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20   Release a page 
34220 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a  reference..**.**
34230 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
34240 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
34250 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
34260 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
34270 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
34280 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
34290 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
342a0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
342b0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
342c0 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
342d0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
342e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
342f0 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
34300 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
34310 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
34320 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
34330 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65   pPg ){.    Page
34340 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
34350 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 69 66 28  >pPager;.    if(
34360 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47   pPg->flags & PG
34370 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20  HDR_MMAP ){.    
34380 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61    pagerReleaseMa
34390 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  pPage(pPg);.    
343a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
343b0 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
343c0 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
343d0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
343e0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
343f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
34400 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
34410 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
34420 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
34430 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
34440 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
34450 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
34460 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
34470 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
34480 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
34490 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
344a0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
344b0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
344c0 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
344d0 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
344e0 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
344f0 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
34500 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
34510 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
34520 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
34530 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
34540 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
34550 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
34560 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
34570 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
34580 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
34590 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
345a0 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
345b0 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
345c0 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
345d0 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
345e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
345f0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
34600 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
34610 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
34620 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
34630 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
34640 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
34650 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
34660 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
34670 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
34680 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
34690 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
346a0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
346b0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
346c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
346d0 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
346e0 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
346f0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
34700 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
34710 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
34720 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
34730 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
34740 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
34750 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
34760 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
34770 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
34780 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
34790 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
347a0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
347b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
347c0 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
347d0 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
347e0 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
347f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
34800 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
34810 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
34820 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
34830 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
34840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34850 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
34860 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
34870 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
34880 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
34890 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
348a0 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
348b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
348c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
348d0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
348e0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
348f0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
34900 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
34910 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
34920 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
34930 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
34940 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
34950 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
34960 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
34970 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68   on.  ** the oth
34980 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f  er hand, this ro
34990 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
349a0 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20  alled if we are 
349b0 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20  already in.  ** 
349c0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  an error state. 
349d0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
349e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
349f0 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
34a00 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
34a10 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
34a20 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
34a30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
34a40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
34a50 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OFF ){.    pPage
34a60 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
34a70 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
34a80 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
34a90 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
34aa0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
34ab0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
34ac0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
34ad0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
34ae0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
34af0 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
34b00 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
34b10 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73  . */.    if( !is
34b20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
34b30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
34b40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
34b50 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
34b60 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
34b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
34b80 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
34b90 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
34ba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34bb0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
34bc0 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
34bd0 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
34be0 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  s to open journa
34bf0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  l file */.      
34c00 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
34c10 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
34c20 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
34c30 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
34c40 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
34c50 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
34c60 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
34c70 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
34c80 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
34c90 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
34ca0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
34cb0 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20  RNAL).          
34cc0 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  );.  #ifdef SQLI
34cd0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
34ce0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 72  _WRITE.        r
34cf0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
34d00 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
34d10 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
34d20 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
34d30 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
34d40 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
34d50 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 29  Pager).        )
34d60 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20  ;.  #else.      
34d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
34d80 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
34d90 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
34da0 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
34db0 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20   0);.  #endif.  
34dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
34dd0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
34de0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
34df0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
34e00 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57  }.  .  .    /* W
34e10 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
34e20 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
34e30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34e40 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20  e and open .    
34e50 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
34e60 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
34e70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34e80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34e90 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
34ea0 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
34eb0 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
34ec0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
34ed0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
34ee0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
34ef0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
34f00 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
34f10 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
34f20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
34f30 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
34f40 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
34f50 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
34f60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
34f70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34f80 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
34f90 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
34fa0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
34fb0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
34fc0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
34fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
34fe0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
34ff0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
35000 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70  _LOCKED );.    p
35010 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
35020 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
35030 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  HEMOD;.  }..  re
35040 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35050 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
35060 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
35070 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
35080 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
35090 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
350a0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
350b0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
350c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
350d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
350e0 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
350f0 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
35100 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
35110 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
35120 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
35130 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
35140 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
35150 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
35160 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
35170 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
35180 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
35190 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
351a0 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
351b0 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
351c0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
351d0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
351e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
351f0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
35200 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
35210 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
35220 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
35230 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
35240 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
35250 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
35260 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
35270 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
35280 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
35290 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
352a0 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
352b0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
352c0 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
352d0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
352e0 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
352f0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
35300 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
35310 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
35320 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
35330 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
35340 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
35350 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
35360 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
35370 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
35380 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
35390 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
353a0 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
353b0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
353c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
353d0 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
353e0 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
353f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35400 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
35410 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
35420 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
35430 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
35440 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
35450 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
35460 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
35470 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61  R_ERROR );.  pPa
35480 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
35490 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
354a0 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57  mory;..  if( ALW
354b0 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61  AYS(pPager->eSta
354c0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
354d0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
354e0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
354f0 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  nal==0 );..    i
35500 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
35510 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
35520 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
35530 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
35540 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
35550 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
35560 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
35570 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
35580 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
35590 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
355a0 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
355b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
355c0 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
355d0 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
355e0 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
355f0 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
35600 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
35610 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
35620 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
35630 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
35640 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
35670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
35680 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
35690 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
356a0 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Wal, 1);.      }
356b0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20  ..      /* Grab 
356c0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
356d0 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
356e0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75  If successful, u
356f0 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20  pgrade to.      
35700 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
35710 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  D state. Otherwi
35720 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
35730 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
35740 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
35750 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
35760 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
35770 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
35780 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
35790 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
357a0 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
357b0 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75   possible, the u
357c0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
357d0 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a  call it..      *
357e0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
357f0 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
35800 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
35810 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
35820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
35830 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  Obtain a RESERVE
35840 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
35850 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
35860 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d  the exFlag param
35870 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  eter.      ** is
35880 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
35890 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
358a0 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
358b0 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
358c0 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e       ** busy-han
358d0 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61  dler callback ca
358e0 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75  n be used when u
358f0 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20  pgrading to the 
35900 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20  EXCLUSIVE.      
35910 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74  ** lock, but not
35920 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20   when obtaining 
35930 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
35940 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
35950 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
35960 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
35970 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
35980 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35990 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a  OK && exFlag ){.
359a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
359b0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
359c0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
359d0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
359e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
359f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35a00 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65  .      /* Change
35a10 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   to WRITER_LOCKE
35a20 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  D state..      *
35a30 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d  *.      ** WAL m
35a40 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65  ode sets Pager.e
35a50 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57  State to PAGER_W
35a60 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20  RITER_LOCKED or 
35a70 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a  CACHEMOD.      *
35a80 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e  * when it has an
35a90 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   open transactio
35aa0 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20  n, but never to 
35ab0 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45  DBMOD or FINISHE
35ac0 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  D..      ** This
35ad0 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74   is because in t
35ae0 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20  hose states the 
35af0 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63  code to roll bac
35b00 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  k savepoint .   
35b10 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
35b20 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61  ns may copy data
35b30 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
35b40 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64  urnal into the d
35b50 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a  atabase .      *
35b60 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61  * file as well a
35b70 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20  s into the page 
35b80 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75  cache. Which wou
35b90 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20  ld be incorrect 
35ba0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c  in .      ** WAL
35bb0 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   mode..      */.
35bc0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
35bd0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
35be0 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  TER_LOCKED;.    
35bf0 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
35c00 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
35c10 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
35c20 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
35c30 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
35c40 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
35c50 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
35c60 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
35c70 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
35c80 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
35c90 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
35ca0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
35cb0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
35cc0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
35cd0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
35ce0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
35cf0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
35d00 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
35d10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
35d20 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
35d30 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  e(pPager) );.  }
35d40 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
35d50 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
35d60 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
35d70 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  er)));.  return 
35d80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
35d90 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
35da0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
35db0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
35dc0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
35dd0 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
35de0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
35df0 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
35e00 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
35e10 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
35e20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
35e30 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
35e40 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
35e50 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
35e60 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
35e70 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
35e80 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
35e90 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
35ea0 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
35eb0 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
35ec0 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
35ed0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
35ee0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
35ef0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
35f00 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
35f10 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
35f20 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
35f30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
35f40 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
35f50 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  e is not called 
35f60 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74  unless a write-t
35f70 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
35f80 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65  lready .  ** bee
35f90 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a  n started. The j
35fa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
35fb0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
35fc0 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  en at this point
35fd0 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76  ..  ** It is nev
35fe0 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  er called in the
35ff0 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20   ERROR state..  
36000 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
36010 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36020 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
36030 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
36040 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36050 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
36060 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
36070 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36080 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
36090 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
360a0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
360b0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
360c0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
360d0 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
360e0 20 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72   detected, repor
360f0 74 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  t the same error
36100 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 54 68 69  .  ** again. Thi
36110 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70  s should not hap
36120 70 65 6e 2c 20 62 75 74 20 74 68 65 20 63 68 65  pen, but the che
36130 63 6b 20 70 72 6f 76 69 64 65 73 20 72 6f 62 75  ck provides robu
36140 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
36150 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
36160 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75 72  rrCode) )  retur
36170 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
36180 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d  e;..  /* Higher-
36190 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e  level routines n
361a0 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66  ever call this f
361b0 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62  unction if datab
361c0 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ase is not.  ** 
361d0 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63  writable.  But c
361e0 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73  heck anyway, jus
361f0 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  t for robustness
36200 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
36210 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c  (pPager->readOnl
36220 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  y) ) return SQLI
36230 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 43 48 45 43  TE_PERM;..  CHEC
36240 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
36250 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
36260 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
36270 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c  opened. Higher l
36280 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61  evel routines ha
36290 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
362a0 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63  obtained the nec
362b0 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20  essary locks to 
362c0 62 65 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d  begin the write-
362d0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
362e0 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61   the.  ** rollba
362f0 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  ck journal might
36300 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e   not yet be open
36310 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66  . Open it now if
36320 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
36330 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
36340 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
36350 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
36360 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
36370 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a  ) on the page. .
36380 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
36390 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20  if it were done 
363a0 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71  after calling sq
363b0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
363c0 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a  irty(), then.  *
363d0 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74  * an error might
363e0 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20 70   occur and the p
363f0 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75  ager would end u
36400 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  p in WRITER_LOCK
36410 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69  ED state.  ** wi
36420 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65 64 20  th pages marked 
36430 61 73 20 64 69 72 74 79 20 69 6e 20 74 68 65 20  as dirty in the 
36440 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cache..  */.  if
36450 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
36460 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
36470 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72 63 20  OCKED ){.    rc 
36480 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
36490 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
364a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
364b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
364c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
364d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
364e0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
364f0 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  EMOD );.  assert
36500 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
36510 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
36520 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
36530 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
36540 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
36550 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
36560 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
36570 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
36580 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
36590 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71   away..  */.  sq
365a0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
365b0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
365c0 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
365d0 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75  Pg) && !subjRequ
365e0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
365f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
36600 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
36610 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) );.  }else{.  
36620 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
36630 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
36640 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
36650 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
36660 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
36670 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
36680 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
36690 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
366a0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
366b0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
366c0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
366d0 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
366e0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
366f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
36700 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
36710 29 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  ) && !pagerUseWa
36720 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
36730 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
36740 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
36750 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
36760 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
36770 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20  ->dbOrigSize && 
36780 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
36790 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  fd) ){.        u
367a0 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
367b0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
367c0 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66          i64 iOff
367d0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
367e0 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20  alOff;..        
367f0 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
36800 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
36810 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
36820 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
36830 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
36840 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
36850 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
36860 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
36870 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
36880 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
36890 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
368a0 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
368b0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
368c0 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73   );..        ass
368d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
368e0 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d  rnalHdr<=pPager-
368f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
36900 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
36910 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
36920 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
36930 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
36940 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
36950 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
36960 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
36970 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 20 20  *)pData2);..    
36980 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61      /* Even if a
36990 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
369a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
369b0 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  ile journalling 
369c0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
369d0 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  age in the block
369e0 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20   above, set the 
369f0 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66  need-sync flag f
36a00 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  or the page..   
36a10 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
36a20 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  e, when the tran
36a30 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
36a40 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69  d back, the logi
36a50 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  c in.        ** 
36a60 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
36a70 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74  e() will think t
36a80 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
36a90 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ds to be restore
36aa0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  d.        ** in 
36ab0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36ac0 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20  e. And if an IO 
36ad0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
36ae0 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20  le doing so,.   
36af0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72       ** then cor
36b00 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c  ruption may foll
36b10 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ow..        */. 
36b20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
36b30 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
36b40 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20 72  SYNC;..        r
36b50 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
36b60 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
36b70 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
36b80 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
36b90 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
36ba0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63  n rc;.        rc
36bb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
36bc0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
36bd0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
36be0 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29  ageSize, iOff+4)
36bf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
36c00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
36c10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
36c20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
36c30 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
36c40 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  Off+pPager->page
36c50 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a  Size+4, cksum);.
36c60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
36c70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
36c80 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20  rn rc;..        
36c90 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
36ca0 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
36cb0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
36cc0 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
36cd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
36ce0 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
36cf0 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
36d00 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
36d10 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
36d20 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
36d30 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
36d40 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  (("JOURNAL %d pa
36d50 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
36d60 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
36d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41  .             PA
36d80 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
36d90 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
36da0 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
36db0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
36dc0 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
36dd0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
36de0 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67  );..        pPag
36df0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
36e00 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  = 8 + pPager->pa
36e10 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
36e20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
36e30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36e40 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
36e50 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
36e60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
36e70 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
36e80 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
36e90 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
36ea0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
36eb0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
36ec0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
36ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
36ee0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
36ef0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20  ;.        rc |= 
36f00 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
36f10 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
36f20 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
36f30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
36f50 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
36f60 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
36f70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
36f80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36fa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
36fb0 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
36fc0 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20  R_DBMOD ){.     
36fd0 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
36fe0 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
36ff0 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NC;.        }.  
37000 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
37010 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  (("APPEND %d pag
37020 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
37030 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
37040 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
37050 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
37060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37070 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
37080 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
37090 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0)));.      }.  
370a0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
370b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
370c0 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
370d0 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
370e0 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
370f0 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
37100 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
37110 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
37120 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
37130 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
37140 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
37150 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
37160 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
37170 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
37180 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
37190 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
371a0 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
371b0 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
371c0 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
371d0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
371e0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
371f0 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
37200 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
37210 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
37220 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
37230 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
37240 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d  ger->dbSize<pPg-
37250 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
37260 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
37270 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
37280 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37290 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
372a0 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
372b0 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
372c0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
372d0 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20  fore .** making 
372e0 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
372f0 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  e. The caller mu
37300 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
37310 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  urn value .** of
37320 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
37330 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
37340 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20  t to change any 
37350 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73  page data unless
37360 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
37370 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
37380 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  _OK..**.** The d
37390 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
373a0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
373b0 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
373c0 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
373d0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
373e0 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
373f0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
37400 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
37410 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
37420 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
37430 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
37440 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
37450 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
37460 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
37470 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
37480 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
37490 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
374a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
374b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61  QLITE_NOMEM or a
374c0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
374d0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
374e0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f  s appropriate. O
374f0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
37500 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
37510 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
37520 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
37530 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37540 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
37550 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
37560 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
37570 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
37580 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
37590 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
375a0 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
375b0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
375c0 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
375d0 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50  ags & PGHDR_MMAP
375e0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
375f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37600 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
37610 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
37620 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
37630 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
37640 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
37650 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
37660 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
37670 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
37680 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
37690 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
376a0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
376b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
376c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
376d0 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
376e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
376f0 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
37700 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
37710 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
37720 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
37730 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
37740 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
37750 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
37760 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
37770 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
37780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37790 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
377a0 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
377b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
377c0 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
377d0 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
377e0 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a  _SYNC */..    /*
377f0 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
37800 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20  ncSpill flag to 
37810 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
37820 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
37830 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72  ow.    ** a jour
37840 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65  nal header to be
37850 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
37860 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
37870 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74  aled by.    ** t
37880 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
37890 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
378a0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
378b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
378c0 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30  oNotSyncSpill==0
378d0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
378e0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b  doNotSyncSpill++
378f0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
37900 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
37910 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
37920 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
37930 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
37940 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
37950 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
37960 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
37970 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
37980 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
37990 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
379a0 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
379b0 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
379c0 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
379d0 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
379e0 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
379f0 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f   1;..    nPageCo
37a00 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  unt = pPager->db
37a10 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Size;.    if( pP
37a20 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
37a30 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
37a40 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
37a50 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
37a60 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
37a70 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
37a80 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
37a90 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
37aa0 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
37ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
37ac0 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
37ad0 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
37ae0 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
37af0 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
37b00 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
37b10 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
37b20 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
37b30 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
37b40 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
37b50 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
37b60 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
37b70 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
37b80 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
37b90 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
37ba0 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
37bb0 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
37bc0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
37bd0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
37be0 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
37bf0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
37c00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37c10 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
37c20 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
37c30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
37c40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
37c60 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
37c70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
37c80 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
37c90 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
37ca0 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
37cb0 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
37cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
37cd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
37ce0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
37cf0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
37d00 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
37d10 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
37d20 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
37d30 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
37d40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
37d50 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
37d60 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
37d70 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
37d80 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
37d90 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
37da0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
37db0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
37dc0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
37dd0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
37de0 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  C flag is set fo
37df0 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61  r any of the nPa
37e00 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
37e10 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
37e20 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20  , then it needs 
37e30 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c  to be set for al
37e40 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75  l of them. Becau
37e50 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e  se.    ** writin
37e60 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73  g to any of thes
37e70 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61  e nPage pages ma
37e80 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68  y damage the oth
37e90 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ers, the.    ** 
37ea0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
37eb0 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29  t contain sync()
37ec0 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c  ed copies of all
37ed0 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
37ee0 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68  before any of th
37ef0 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  em can be writte
37f00 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
37f10 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
37f20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
37f30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64  QLITE_OK && need
37f40 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
37f50 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
37f60 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
37f70 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b  ii<nPage; ii++){
37f80 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
37f90 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
37fa0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31  okup(pPager, pg1
37fb0 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii);.        if
37fc0 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ( pPage ){.     
37fd0 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67       pPage->flag
37fe0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
37ff0 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
38000 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
38010 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
38020 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
38030 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
38040 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
38050 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20  Spill==1 );.    
38060 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
38070 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73  cSpill--;.  }els
38080 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
38090 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
380a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
380b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
380c0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
380d0 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
380e0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
380f0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
38100 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
38110 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
38120 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
38130 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
38140 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
38150 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
38160 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
38170 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
38180 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
38190 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
381a0 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
381b0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
381c0 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
381d0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
381e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
381f0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
38200 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
38210 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
38220 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
38230 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
38240 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
38250 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
38260 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
38270 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
38280 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
38290 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
382a0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
382b0 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
382c0 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
382d0 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
382e0 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
382f0 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
38300 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
38310 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
38320 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
38330 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
38340 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
38350 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
38360 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68  ge is unused. Th
38370 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
38380 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
38390 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
383a0 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
383b0 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
383c0 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
383d0 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
383e0 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c  ion can quadrupl
383f0 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
38400 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20  arge .** DELETE 
38410 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76  operations..*/.v
38420 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
38430 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20  DontWrite(PgHdr 
38440 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
38450 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
38460 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67  ager;.  if( (pPg
38470 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
38480 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e  RTY) && pPager->
38490 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
384a0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
384b0 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
384c0 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
384d0 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
384e0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
384f0 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
38500 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
38510 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
38520 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
38530 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
38540 45 3b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  E;.    pager_set
38550 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
38560 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
38570 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
38580 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
38590 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
385a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
385b0 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  .** change-count
385c0 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
385d0 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
385e0 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69  n integer starti
385f0 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f  ng at .** byte o
38600 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20  ffset 24 of the 
38610 70 61 67 65 72 20 66 69 6c 65 2e 20 20 54 68 65  pager file.  The
38620 20 73 65 63 6f 6e 64 61 72 79 20 63 68 61 6e 67   secondary chang
38630 65 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a 20  e counter at.** 
38640 39 32 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74  92 is also updat
38650 65 64 2c 20 61 73 20 69 73 20 74 68 65 20 53 51  ed, as is the SQ
38660 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
38670 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36  ber at offset 96
38680 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69 73  ..**.** But this
38690 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
386a0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
386b0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
386c0 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 54  g is false..** T
386d0 6f 20 61 76 6f 69 64 20 65 78 63 65 73 73 20 63  o avoid excess c
386e0 68 75 72 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  hurning of page 
386f0 31 2c 20 74 68 65 20 75 70 64 61 74 65 20 6f 6e  1, the update on
38700 6c 79 20 68 61 70 70 65 6e 73