/ Hex Artifact Content
Login

Artifact 3e9a15939684b0af441325f05335331b15979c9d:


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 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
7c70: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
7c80: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
7c90: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
7cf0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
7d00: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
7d10: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
7d20: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
7d30: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
7d40: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
7d50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7d60: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
7d70: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
7d80: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
7d90: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
7da0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
7db0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
7dc0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
7dd0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
7de0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
7df0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
7e00: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
7e10: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7e30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7e40: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
7e50: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e70: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
7e80: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
7e90: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
7ea0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
7eb0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
7ec0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
7ed0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
7ee0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
7ef0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
7f00: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7f10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7f20: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
7f30: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
7f40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
7f50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7f60: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
7f70: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
7f80: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
7f90: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
7fa0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
7fb0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
7fc0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
7fd0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
7fe0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
7ff0: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8000: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8010: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8020: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8030: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8040: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8060: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
8070: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
8080: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
8090: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
80a0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
80b0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
80c0: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
80d0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
80e0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
80f0: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
8100: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8110: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
8120: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
8130: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
8140: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
8150: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
8160: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
8170: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
8180: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
8190: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
81a0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
81b0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
81c0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
81e0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
81f0: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
8200: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8210: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
8220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8230: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
8240: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
8250: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
8260: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
8270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
8280: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
8290: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
82a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
82b0: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
82c0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
82d0: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
82e0: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
82f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
8300: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8310: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8320: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
8330: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
8340: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  log */.#endif.};
8350: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20  ../*.** Indexes 
8360: 66 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67  for use with Pag
8370: 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20  er.aStat[]. The 
8380: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72  Pager.aStat[] ar
8390: 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ray contains.** 
83a0: 74 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73  the values acces
83b0: 73 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53  sed by passing S
83c0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
83d0: 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f  ACHE_HIT, CACHE_
83e0: 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48  MISS .** or CACH
83f0: 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74  E_WRITE to sqlit
8400: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a  e3_db_status()..
8410: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
8420: 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64  _STAT_HIT   0.#d
8430: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
8440: 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65  _MISS  1.#define
8450: 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54   PAGER_STAT_WRIT
8460: 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  E 2../*.** The f
8470: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
8480: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
8490: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
84a0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
84b0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
84c0: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
84d0: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
84e0: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
84f0: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
8500: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
8510: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
8520: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
8530: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
8540: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
8550: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
8560: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
8570: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
8580: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8590: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
85a0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
85b0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
85c0: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
85d0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
85e0: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
85f0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8600: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
8610: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
8620: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8630: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
8640: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8650: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
8660: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
8670: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
8680: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
8690: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
86a0: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
86b0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
86c0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
86d0: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
86e0: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
86f0: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
8700: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
8710: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
8720: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
8730: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
8740: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
8750: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
8760: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
8770: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
8780: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
8790: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
87a0: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
87b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
87c0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
87d0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
87e0: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
87f0: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
8800: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
8810: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
8820: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
8830: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
8840: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
8850: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
8860: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
8870: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
8880: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
8890: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
88a0: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
88b0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
88c0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
88d0: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
88e0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
88f0: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
8900: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
8910: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
8920: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
8930: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
8940: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
8950: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
8960: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
8970: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
8980: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
8990: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
89a0: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
89b0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
89c0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
89d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
89e0: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
89f0: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
8a00: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
8a10: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
8a20: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
8a30: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
8a40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
8a50: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
8a60: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
8a70: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
8a80: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
8a90: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
8aa0: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
8ab0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
8ac0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
8ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
8ae0: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
8af0: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
8b00: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
8b10: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
8b20: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
8b30: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
8b40: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
8b50: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
8b60: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
8b70: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
8b80: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8b90: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
8ba0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
8bb0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
8bc0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
8bd0: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
8be0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8bf0: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
8c00: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
8c10: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
8c20: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
8c30: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
8c40: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
8c50: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
8c60: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
8c70: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
8c80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
8c90: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
8ca0: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
8cb0: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
8cc0: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
8cd0: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
8ce0: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
8cf0: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
8d00: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
8d10: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
8d20: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
8d30: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
8d40: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
8d50: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
8d60: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
8d70: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
8d80: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
8d90: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
8da0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
8db0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
8dc0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
8dd0: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
8de0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
8df0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
8e00: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
8e10: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
8e20: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
8e30: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
8e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8e50: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
8e60: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
8e70: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
8e80: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
8e90: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
8ea0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
8eb0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
8ec0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8ed0: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
8ee0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
8ef0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
8f00: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
8f10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
8f20: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
8f30: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
8f40: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
8f50: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
8f60: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
8f70: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
8f80: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
8f90: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
8fa0: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
8fb0: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
8fc0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
8fd0: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
8fe0: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
8ff0: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
9000: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
9010: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
9020: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
9030: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ods)../*.** Retu
9040: 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20  rn true if this 
9050: 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69  pager uses a wri
9060: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73  te-ahead log ins
9070: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
9080: 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  l.** rollback jo
9090: 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65  urnal. Otherwise
90a0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64   false..*/.#ifnd
90b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
90c0: 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  AL.static int pa
90d0: 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20  gerUseWal(Pager 
90e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
90f0: 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  rn (pPager->pWal
9100: 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  !=0);.}.#else.# 
9110: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9120: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9130: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
9140: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
9150: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
9160: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
9170: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
9180: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9190: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
91a0: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
91b0: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
91c0: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
91d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a  fndef NDEBUG ./*
91e0: 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  .** Usage:.**.**
91f0: 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
9200: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
9210: 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54  ager) );.**.** T
9220: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  his function run
9230: 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74  s many asserts t
9240: 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e  o try to find in
9250: 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e  consistencies in
9260: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
9270: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
9280: 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ger object..*/.s
9290: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
92a0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
92b0: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
92c0: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
92d0: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
92e0: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
92f0: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
9300: 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20  PAGER_OPEN.     
9310: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9320: 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
9330: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9340: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
9350: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
9360: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9370: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
9380: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9390: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
93a0: 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
93b0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
93c0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
93d0: 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  HED.       || p-
93e0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
93f0: 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  RROR.  );..  /* 
9400: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
9410: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
9420: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
9430: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
9440: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
9450: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
9460: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
9470: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9480: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
9490: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
94a0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
94b0: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
94c0: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
94d0: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
94e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
94f0: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
9500: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9510: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9520: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
9530: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
9540: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
9550: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
9560: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
9570: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
9580: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
9590: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
95a0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
95b0: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
95c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
95d0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
95e0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
95f0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9600: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9610: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
9620: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
9630: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9640: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
9650: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
9660: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
9670: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
9680: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
9690: 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69  noSync. And an i
96a0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
96b0: 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68  . Since .  ** th
96c0: 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d  is means an in-m
96d0: 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66  emory pager perf
96e0: 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c  orms no IO at al
96f0: 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63  l, it cannot enc
9700: 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74  ounter .  ** eit
9710: 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
9720: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   or SQLITE_FULL 
9730: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
9740: 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a  or while finaliz
9750: 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  ing .  ** a jour
9760: 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f  nal file. (altho
9770: 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ugh the in-memor
9780: 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d  y journal implem
9790: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20  entation may .  
97a0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
97b0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69  _IOERR_NOMEM whi
97c0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  le the journal f
97d0: 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69  ile is being wri
97e0: 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20  tten). It .  ** 
97f0: 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74  is therefore not
9800: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e   possible for an
9810: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
9820: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
9830: 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ROR .  ** state.
9840: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
9850: 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
9860: 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20   p->noSync );.  
9870: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9880: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9890: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
98a0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  .         || p->
98b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
98c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
98d0: 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20  EMORY .    );.  
98e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
98f0: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
9900: 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50   && p->eState!=P
9910: 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
9920: 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
9930: 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20  eWal(p)==0 );.  
9940: 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67  }..  /* If chang
9950: 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65  eCountDone is se
9960: 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  t, a RESERVED lo
9970: 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
9980: 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20  st be held.  ** 
9990: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  on the file..  *
99a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
99b0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
99c0: 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  one==0 || pPager
99d0: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
99e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
99f0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45  rt( p->eLock!=PE
9a00: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  NDING_LOCK );.. 
9a10: 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61   switch( p->eSta
9a20: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
9a30: 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20  AGER_OPEN:.     
9a40: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
9a50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9a60: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9a70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9a80: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9a90: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
9aa0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
9ab0: 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  he)==0 || pPager
9ac0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
9ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9ae0: 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45  case PAGER_READE
9af0: 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  R:.      assert(
9b00: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9b10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9b20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9b30: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
9b40: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
9b50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53  ert( p->eLock>=S
9b60: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
9b70: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9b80: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
9b90: 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20  R_LOCKED:.      
9ba0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9bb0: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9bc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9bd0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
9be0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9bf0: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
9c00: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
9c10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9c20: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
9c30: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9c40: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9c50: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
9c60: 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
9c70: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9c80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9c90: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9ca0: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9cb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9cc0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9cd0: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
9ce0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9cf0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
9d00: 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Master==0 );.   
9d10: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
9d20: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
9d30: 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20  _CACHEMOD:.     
9d40: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9d50: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9d60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9d70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9d80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9d90: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
9da0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
9db0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69  .        /* It i
9dc0: 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
9dd0: 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
9de0: 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65  wal here that ne
9df0: 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20 20  ither the.      
9e00: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
9e10: 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69  e nor the WAL fi
9e20: 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69  le are open. Thi
9e30: 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67  s happens during
9e40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f  .        ** a ro
9e50: 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
9e60: 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65 73  on that switches
9e70: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   from journal_mo
9e80: 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a  de=off.        *
9e90: 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  * to journal_mod
9ea0: 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a  e=wal..        *
9eb0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
9ec0: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ( p->eLock>=RESE
9ed0: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RVED_LOCK );.   
9ee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
9ef0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
9f00: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
9f10: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9f20: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9f30: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF .            
9f40: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9f50: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9f60: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
9f70: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
9f80: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9f90: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
9fa0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
9fb0: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
9fc0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
9fd0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
9fe0: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
9ff0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a000: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a010: 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61  R_DBMOD:.      a
a020: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a030: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a040: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a050: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a060: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a070: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a080: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a090: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a0a0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43  t( p->eLock>=EXC
a0b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a0c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a0d0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a0e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a0f0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a100: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a110: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a120: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a130: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a140: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
a150: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a160: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a170: 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  <=pPager->dbHint
a180: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a190: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a1a0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
a1b0: 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  SHED:.      asse
a1c0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  rt( p->eLock==EX
a1d0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a1e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a1f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a200: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a210: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
a220: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a230: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a240: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a250: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a260: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a270: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a280: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a290: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a2a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a2b0: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a2c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a2d0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a2e0: 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20  ERROR:.      /* 
a2f0: 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  There must be at
a300: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
a310: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
a320: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69 66   to the pager if
a330: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52  .      ** in ERR
a340: 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
a350: 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73 68  ise the pager sh
a360: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
a370: 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20  y dropped.      
a380: 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  ** back to OPEN 
a390: 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
a3a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a3b0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
a3c0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a3d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a3e0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
a3f0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a400: 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  >0 );.      brea
a410: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
a420: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
a430: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
a440: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a450: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
a460: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
a470: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
a480: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
a490: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
a4a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
a4b0: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
a4c0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
a4d0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
a4e0: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
a4f0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
a500: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
a510: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
a520: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
a530: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
a540: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
a550: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
a560: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
a570: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
a580: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
a590: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a5a0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
a5b0: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
a5c0: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
a5d0: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
a5e0: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
a5f0: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
a600: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
a610: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
a620: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
a630: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
a640: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
a650: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
a660: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
a670: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
a680: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
a690: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
a6a0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
a6b0: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
a6c0: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
a6d0: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
a6e0: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
a6f0: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
a700: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
a710: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
a720: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
a730: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
a740: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
a750: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
a760: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
a770: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
a780: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
a790: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
a7a0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
a7b0: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
a7c0: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
a7d0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7e0: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
a7f0: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
a800: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
a810: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
a820: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
a830: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
a840: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
a850: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a860: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
a870: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
a880: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a890: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a8a0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
a8b0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
a8c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a8d0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
a8e0: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
a8f0: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
a900: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
a910: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
a920: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
a930: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
a940: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
a950: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
a960: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
a970: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
a980: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
a990: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
a9a0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
a9b0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
a9c0: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
a9d0: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
a9e0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
a9f0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
aa00: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
aa10: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
aa20: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
aa30: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
aa40: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
aa50: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aa60: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aa70: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
aa80: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
aa90: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aaa0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aab0: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
aac0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
aad0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
aae0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
aaf0: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
ab00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
ab10: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ab20: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
ab30: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
ab40: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
ab50: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ab60: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
ab70: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
ab80: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
ab90: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aba0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
abb0: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
abc0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
abd0: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
abe0: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
abf0: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
ac00: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
ac10: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
ac20: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
ac30: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
ac40: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
ac50: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
ac60: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
ac70: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
ac80: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t;.}.#endif../*.
ac90: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
aca0: 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  f it is necessar
acb0: 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20  y to write page 
acc0: 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75  *pPg into the su
acd0: 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20  b-journal..** A 
ace0: 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
acf0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ad00: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
ad10: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e   there exists on
ad20: 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65  e.** or more ope
ad30: 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72  n savepoints for
ad40: 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20   which:.**.**   
ad50: 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  * The page-numbe
ad60: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
ad70: 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72  r equal to Pager
ad80: 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c  Savepoint.nOrig,
ad90: 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
ada0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
adb0: 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75  g to the page-nu
adc0: 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20  mber is not set 
add0: 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  in.**     PagerS
ade0: 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
adf0: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
ae00: 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65   int subjRequire
ae10: 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  sPage(PgHdr *pPg
ae20: 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  ){.  Pgno pgno =
ae30: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61   pPg->pgno;.  Pa
ae40: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ae50: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
ae60: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
ae70: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
ae80: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  int; i++){.    P
ae90: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
aea0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
aeb0: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
aec0: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
aed0: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
aee0: 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e  itvecTest(p->pIn
aef0: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
af00: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
af10: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
af20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
af30: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
af40: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
af50: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
af60: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rnal file..*/.st
af70: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a  atic int pageInJ
af80: 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
af90: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
afa0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
afb0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Pg->pPager->pInJ
afc0: 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
afd0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  o);.}../*.** Rea
afe0: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
aff0: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
b000: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
b010: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
b020: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
b030: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
b040: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b050: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
b060: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
b070: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
b080: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
b090: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
b0a0: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
b0b0: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
b0c0: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
b0d0: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
b0e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b0f0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b100: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
b110: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
b120: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
b130: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
b140: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
b150: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
b160: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b170: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
b180: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
b190: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b1a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
b1b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b1c0: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
b1d0: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
b1e0: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
b1f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
b200: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
b210: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
b220: 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  A,B).../*.** Wri
b230: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
b240: 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ger into the giv
b250: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
b260: 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  or.  Return SQLI
b270: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
b280: 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
b290: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
b2a0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
b2b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
b2c0: 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  e32bits(sqlite3_
b2d0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
b2e0: 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a  fset, u32 val){.
b2f0: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
b300: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
b310: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
b320: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
b330: 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a  ac, 4, offset);.
b340: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
b350: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b360: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
b370: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
b380: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a  either NO_LOCK.*
b390: 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  * or SHARED_LOCK
b3a0: 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
b3b0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b3c0: 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f  he call to xUnlo
b3d0: 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73  ck().** succeeds
b3e0: 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
b3f0: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b400: 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74  o match the (att
b410: 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b  empted) new lock
b420: 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
b430: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b440: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b450: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b460: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63  function is.** c
b470: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
b480: 64 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65  dify it. See the
b490: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b4a0: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a  he #define of .*
b4b0: 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  * UNKNOWN_LOCK f
b4c0: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
b4d0: 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  n of this..*/.st
b4e0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
b4f0: 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  lockDb(Pager *pP
b500: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
b510: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b520: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
b530: 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  t( !pPager->excl
b540: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
b550: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63  ger->eLock==eLoc
b560: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  k );.  assert( e
b570: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
b580: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
b590: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
b5a0: 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20   eLock!=NO_LOCK 
b5b0: 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
b5c0: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69  Pager)==0 );.  i
b5d0: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
b5e0: 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
b5f0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
b600: 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck>=eLock );.   
b610: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55   rc = sqlite3OsU
b620: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
b630: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , eLock);.    if
b640: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21  ( pPager->eLock!
b650: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
b660: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b670: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
b690: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20  ACE(("UNLOCK %p 
b6a0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65  %d\n", pPager, e
b6b0: 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74  Lock)).  }.  ret
b6c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b6d0: 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   Lock the databa
b6e0: 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c  se file to level
b6f0: 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75   eLock, which mu
b700: 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41  st be either SHA
b710: 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53  RED_LOCK,.** RES
b720: 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58  ERVED_LOCK or EX
b730: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66  CLUSIVE_LOCK. If
b740: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73   the caller is s
b750: 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
b760: 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  he.** Pager.eLoc
b770: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68  k variable to th
b780: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
b790: 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ate. .**.** Exce
b7a0: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
b7b0: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
b7c0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
b7d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b7e0: 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e  .** called, do n
b7f0: 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c  ot modify it unl
b800: 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b  ess the new lock
b810: 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43  ing state is EXC
b820: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a  LUSIVE_LOCK. .**
b830: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
b840: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
b850: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
b860: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
b870: 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69  ation .** of thi
b880: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b890: 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67   pagerLockDb(Pag
b8a0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
b8b0: 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
b8c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
b8d0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
b8e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SHARED_LOCK || e
b8f0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
b900: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58  OCK || eLock==EX
b910: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
b920: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
b930: 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61  ock<eLock || pPa
b940: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
b950: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
b960: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
b970: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65  ck(pPager->fd, e
b980: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Lock);.    if( r
b990: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b9a0: 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d  (pPager->eLock!=
b9b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c  UNKNOWN_LOCK||eL
b9c0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
b9d0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50  OCK) ){.      pP
b9e0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
b9f0: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49  8)eLock;.      I
ba00: 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
ba10: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
ba20: 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20  eLock)).    }.  
ba30: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ba40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
ba50: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
ba60: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
ba70: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
ba80: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
ba90: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
baa0: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
bab0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
bac0: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
bad0: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
bae0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
baf0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
bb00: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
bb10: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
bb20: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
bb30: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
bb40: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
bb50: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
bb60: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
bb70: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
bb80: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
bb90: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
bba0: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
bbb0: 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  ** The optimizat
bbc0: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61  ion is also alwa
bbd0: 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  ys enabled for t
bbe0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
bbf0: 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  It is.** an erro
bc00: 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  r to call this f
bc10: 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65  unction if pPage
bc20: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r is opened on a
bc30: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
bc40: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
bc50: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
bc60: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
bc70: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
bc80: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
bc90: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
bca0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
bcb0: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
bcc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bcd0: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
bce0: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
bcf0: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
bd00: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
bd10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
bd20: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
bd30: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
bd40: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
bd50: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
bd60: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
bd70: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
bd80: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63  le ){.    int dc
bd90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
bdb0: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
bdc0: 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74  stics */.    int
bdd0: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nSector;       
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bdf0: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
be00: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  .    int szPage;
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
be30: 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ize */..    asse
be40: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
be50: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63  r->fd) );.    dc
be60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
be70: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
be80: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
be90: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61     nSector = pPa
bea0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
beb0: 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50  .    szPage = pP
bec0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
bed0: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
bee0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
bef0: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
bf00: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
bf10: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
bf20: 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
bf30: 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53     if( 0==(dc&(S
bf40: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
bf50: 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20  IC|(szPage>>8)) 
bf60: 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67  || nSector>szPag
bf70: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
bf80: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
bf90: 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41  .  return JOURNA
bfa0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
bfb0: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
bfc0: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64  (pPager);.}.#end
bfd0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  if../*.** If SQL
bfe0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
bff0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
c000: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
c010: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
c020: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
c030: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
c040: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
c050: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
c060: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
c070: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
c080: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c090: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
c0a0: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
c0b0: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
c0c0: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
c0d0: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
c0e0: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
c0f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
c100: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
c110: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
c120: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
c130: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
c140: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
c150: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
c160: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
c170: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c180: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
c190: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
c1a0: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
c1b0: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
c1c0: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
c1d0: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
c1e0: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
c1f0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
c200: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
c210: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
c220: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
c230: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c240: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
c250: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
c260: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
c270: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
c280: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
c290: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
c2a0: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
c2b0: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
c2c0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
c2d0: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
c2e0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
c2f0: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
c300: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
c310: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
c320: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
c330: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
c340: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
c350: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
c360: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
c370: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
c380: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
c390: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
c3a0: 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
c3b0: 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
c3c0: 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
c3d0: 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
c3e0: 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68  || pPg->pageHash
c3f0: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
c400: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
c410: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
c420: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
c430: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
c440: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
c450: 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f  efine pager_set_
c460: 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65 66  pagehash(X).#def
c470: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
c480: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
c490: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c4a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
c4b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
c4c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c4d0: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
c4e0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
c4f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
c500: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
c510: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c520: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
c530: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
c540: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
c550: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
c560: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
c570: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
c580: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
c590: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
c5a0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
c5b0: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
c5c0: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
c5d0: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
c5e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c5f0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
c600: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
c610: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
c620: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
c630: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
c640: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
c650: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
c660: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
c670: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
c680: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
c690: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
c6a0: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
c6b0: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
c6c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c6d0: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
c6e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
c6f0: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
c700: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
c710: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
c720: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
c730: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
c740: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
c750: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
c760: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
c770: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
c780: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
c790: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
c7a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c7b0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
c7c0: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
c7d0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
c7e0: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
c7f0: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
c800: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
c810: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
c820: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
c830: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
c840: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
c850: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
c860: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
c870: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
c880: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
c890: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
c8a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c8b0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
c8c0: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
c8d0: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
c8e0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
c8f0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
c900: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c910: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
c920: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
c930: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
c940: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
c950: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
c960: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
c970: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
c980: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
c990: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
c9a0: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
c9b0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
c9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c9d0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
c9e0: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
c9f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
ca00: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
ca10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
ca20: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
ca50: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
ca60: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
ca70: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
caa0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
cab0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
cac0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
cad0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
cae0: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
caf0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
cb00: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
cb10: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
cb20: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
cb30: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
cb40: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
cb50: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
cb60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
cb70: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
cb80: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
cb90: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
cba0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
cbb0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cbc0: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
cbd0: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
cbe0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cbf0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cc00: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
cc10: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
cc20: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
cc30: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
cc40: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
cc50: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
cc60: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
cc70: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
cc80: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cc90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
cca0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
ccb0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
ccc0: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
ccd0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
cce0: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
ccf0: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
cd00: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cd10: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
cd20: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
cd30: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
cd40: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
cd50: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
cd60: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
cd70: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
cd80: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
cd90: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
cda0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
cdb0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
cdc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cdd0: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
cde0: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
cdf0: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
ce00: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
ce10: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
ce20: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
ce30: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
ce40: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
ce50: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
ce60: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
ce70: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
ce80: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
ce90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ceb0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
cec0: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
ced0: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
cee0: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
cef0: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
cf00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cf10: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
cf20: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
cf30: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
cf40: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
cf50: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
cf60: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
cf70: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
cf80: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
cf90: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
cfa0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
cfd0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
cfe0: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
cff0: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
d000: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
d010: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d030: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
d060: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
d070: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
d080: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
d090: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
d0a0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
d0b0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
d0c0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
d0d0: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
d0e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d0f0: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
d100: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
d110: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
d120: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
d130: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
d140: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d150: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
d160: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
d170: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d180: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
d190: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
d1a0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
d1b0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
d1c0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
d1d0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
d1e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d1f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
d200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d210: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
d220: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
d230: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
d240: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
d250: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
d260: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
d270: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
d280: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
d290: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d2a0: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
d2b0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
d2c0: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
d2d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
d2e0: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d2f0: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
d300: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
d310: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
d320: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d330: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
d340: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
d350: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
d360: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
d370: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
d380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
d390: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
d3a0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
d3b0: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
d3c0: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
d3d0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
d3e0: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
d3f0: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
d400: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
d410: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
d420: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
d430: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
d440: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
d450: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
d460: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
d470: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
d480: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
d490: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
d4a0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
d4b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
d4c0: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
d4d0: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
d4e0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
d4f0: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
d500: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
d510: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
d520: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
d530: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
d540: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
d550: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
d560: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
d570: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
d580: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
d590: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
d5a0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
d5b0: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
d5c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d5f0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
d600: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
d610: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
d620: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
d630: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
d640: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
d650: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
d660: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
d670: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
d680: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
d690: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
d6a0: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
d6b0: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
d6c0: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
d6d0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
d6e0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
d6f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
d700: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d710: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
d720: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
d730: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
d740: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
d750: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
d760: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
d770: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
d780: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
d790: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
d7a0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
d7b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d7c0: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
d7d0: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
d7e0: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
d7f0: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
d800: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
d810: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
d820: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
d830: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
d840: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
d850: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
d860: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
d870: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
d880: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
d890: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
d8a0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
d8b0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
d8c0: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
d8d0: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
d8e0: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
d8f0: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
d900: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
d910: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
d920: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
d930: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
d940: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
d950: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
d960: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
d970: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
d980: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
d990: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
d9a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
d9b0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
d9c0: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
d9d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d9e0: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
d9f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
da00: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
da10: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
da20: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
da30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
da40: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
da50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
da60: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
da70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
da80: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
da90: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
daa0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
dab0: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
dac0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
dad0: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
dae0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
daf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
db00: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
db10: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
db20: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
db30: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
db40: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
db50: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
db60: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
db70: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
db80: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
db90: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
dba0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
dbb0: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
dbc0: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
dbd0: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
dbe0: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
dbf0: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
dc00: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
dc10: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
dc20: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
dc30: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
dc40: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
dc50: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
dc60: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
dc70: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
dc80: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
dc90: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
dca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dcb0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
dcc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
dcd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dce0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
dcf0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
dd00: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
dd10: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
dd20: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
dd30: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
dd40: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
dd50: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
dd60: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
dd70: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
dd80: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
dd90: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
dda0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
ddb0: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
dde0: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
ddf0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
de20: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
de30: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
de40: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
de50: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
de60: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
de70: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
de80: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
de90: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
dea0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
deb0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
dec0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
ded0: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
dee0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
def0: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
df00: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
df10: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
df20: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
df30: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
df40: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
df50: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
df60: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
df70: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
df80: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
df90: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
dfa0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
dfb0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
dfc0: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
dfd0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
dfe0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
dff0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e000: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e010: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e020: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e030: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e040: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e050: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e060: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e070: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e080: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e090: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e0a0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e0b0: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e0c0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e0d0: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e0e0: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e0f0: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e100: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e110: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e120: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e130: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e140: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e150: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e160: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e170: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e180: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e190: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e1a0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e1b0: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e1c0: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e1d0: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e1e0: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e1f0: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e200: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e210: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e220: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e230: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e240: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e250: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e260: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e270: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e280: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
e290: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
e2a0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
e2b0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
e2c0: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
e2d0: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
e2e0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
e2f0: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
e300: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
e310: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
e320: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
e330: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
e340: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
e350: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
e360: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
e370: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
e380: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
e390: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
e3a0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
e3b0: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
e3c0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e3d0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
e3e0: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
e3f0: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
e400: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
e410: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
e420: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
e430: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
e440: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e450: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e460: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
e470: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
e480: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
e490: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
e4a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e4b0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e4c0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
e4d0: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
e4e0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
e4f0: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
e500: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e510: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
e520: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
e530: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
e540: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e550: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
e560: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e570: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e580: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
e590: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
e5a0: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
e5b0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
e5c0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
e5d0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
e5e0: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
e5f0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a  initializer */ .
e600: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
e610: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
e620: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
e630: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
e640: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
e650: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e660: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e670: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
e680: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
e690: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
e6a0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
e6b0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e6c0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e6d0: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
e6e0: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
e6f0: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
e700: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
e710: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
e720: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e730: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e740: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
e750: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
e760: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
e770: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
e780: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e790: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e7a0: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
e7b0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
e7c0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
e7d0: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
e7e0: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
e7f0: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
e800: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
e810: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
e820: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
e830: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
e840: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
e850: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
e860: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
e870: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
e880: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
e890: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
e8a0: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
e8b0: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
e8c0: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
e8d0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e8e0: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
e8f0: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
e900: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e910: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
e920: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
e930: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
e940: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
e950: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
e960: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e970: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
e980: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e990: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
e9a0: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
e9b0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
e9c0: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
e9d0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
e9e0: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
e9f0: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
ea00: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
ea10: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
ea20: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
ea30: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
ea40: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
ea50: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
ea60: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
ea70: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
ea80: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
ea90: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
eaa0: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
eab0: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
eac0: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
ead0: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
eae0: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
eaf0: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
eb00: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
eb10: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
eb20: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
eb30: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
eb40: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
eb50: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
eb60: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
eb70: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
eb80: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
eb90: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
eba0: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
ebb0: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
ebc0: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
ebd0: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
ebe0: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
ebf0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
ec00: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
ec10: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
ec20: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
ec30: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
ec40: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
ec50: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
ec60: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
ec70: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
ec80: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
ec90: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
eca0: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
ecb0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
ecc0: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
ecd0: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
ece0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ecf0: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
ed00: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
ed10: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
ed20: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
ed30: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
ed40: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
ed50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ed60: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
ed70: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
ed80: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
ed90: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
eda0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
edb0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
edc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
edd0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
ede0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
edf0: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
ee00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ee10: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
ee20: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
ee30: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
ee40: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
ee50: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
ee60: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
ee70: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
ee80: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
ee90: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
eea0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
eeb0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
eec0: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
eed0: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
eee0: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
eef0: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
ef00: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
ef10: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
ef20: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
ef30: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
ef40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
ef50: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
ef60: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
ef70: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
ef80: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
ef90: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
efa0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
efb0: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
efc0: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
efd0: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
efe0: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
eff0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f000: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f010: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f020: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f030: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f040: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f050: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f060: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f070: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f080: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f090: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f0a0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f0b0: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f0c0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f0d0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f0e0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f0f0: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f100: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f110: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f120: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f130: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f140: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f150: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f160: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f180: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f190: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f1b0: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f1c0: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f1d0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f1e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f1f0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f200: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f210: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f220: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f240: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f250: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f260: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f270: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f280: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f290: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
f2a0: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
f2b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
f2e0: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
f2f0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
f300: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
f310: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
f320: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
f330: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f350: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
f360: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
f370: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
f380: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f390: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
f3a0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
f3b0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
f3c0: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
f3d0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
f3e0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
f3f0: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
f400: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
f410: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
f420: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
f430: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
f440: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
f450: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
f460: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
f470: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
f480: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
f490: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
f4a0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
f4b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
f4c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f4d0: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
f4e0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
f4f0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
f500: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
f510: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
f520: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
f530: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
f540: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f550: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
f560: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
f570: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
f580: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
f590: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
f5a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
f5b0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
f5c0: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
f5d0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
f5e0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f5f0: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
f600: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
f610: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
f620: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
f630: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
f640: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f650: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
f660: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
f670: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
f680: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
f690: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
f6a0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
f6b0: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
f6c0: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
f6d0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
f6e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
f6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f710: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
f720: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
f730: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
f740: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
f750: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
f760: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
f770: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
f780: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
f790: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
f7a0: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
f7b0: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
f7c0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
f7d0: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
f7e0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
f7f0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f800: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f810: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
f820: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
f830: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f840: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f850: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f860: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
f870: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
f880: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f890: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f8a0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f8b0: 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
f8c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
f8d0: 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
f8e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f8f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
f900: 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
f910: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
f920: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
f930: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
f940: 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
f950: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
f960: 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
f970: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
f980: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
f990: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
f9a0: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
f9b0: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
f9c0: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
f9d0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
f9e0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f9f0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fa00: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
fa10: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
fa20: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fa30: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fa40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fa50: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
fa60: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
fa70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fa80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
fa90: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
faa0: 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
fab0: 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
fac0: 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
fad0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
fae0: 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
faf0: 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
fb00: 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
fb10: 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
fb20: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
fb30: 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
fb40: 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
fb50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fb60: 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
fb70: 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
fb80: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
fb90: 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
fba0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
fbb0: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
fbc0: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
fbd0: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
fbe0: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
fbf0: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
fc00: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
fc10: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
fc20: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
fc30: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
fc40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
fc50: 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
fc60: 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
fc70: 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
fc80: 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
fc90: 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
fca0: 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
fcb0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
fcc0: 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
fce0: 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
fcf0: 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
fd00: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
fd10: 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
fd20: 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
fd30: 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
fd40: 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
fd50: 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
fd60: 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
fd70: 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
fd80: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
fd90: 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
fda0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
fdb0: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
fdc0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
fdd0: 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
fde0: 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
fdf0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
fe00: 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
fe10: 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
fe20: 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
fe30: 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
fe40: 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
fe50: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
fe60: 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
fe70: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
fe80: 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
fe90: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
fea0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
feb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
fec0: 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
fed0: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
fee0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
fef0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
ff00: 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
ff10: 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
ff20: 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
ff30: 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
ff40: 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
ff50: 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
ff60: 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
ff70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ff80: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
ff90: 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
ffa0: 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
ffb0: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
ffc0: 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
ffd0: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
ffe0: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
fff0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10000 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
10010 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
10020 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
10030 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
10040 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
10050 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
10060 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
10070 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
10080 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10090 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
100a0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
100b0 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
100c0 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
100d0 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
100e0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
100f0 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10100 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10110 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10120 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
10130 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
10140 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
10150 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10160 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
10170 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
10180 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10190 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
101a0 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
101b0 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
101c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
101d0 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
101e0 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
101f0 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10200 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10210 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10220 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
10230 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
10240 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
10250 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
10260 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
10270 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
10280 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
10290 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
102a0 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
102b0 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
102c0 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
102d0 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
102e0 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
102f0 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10300 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10310 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10320 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
10330 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
10340 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
10350 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10360 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
10370 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
10380 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
10390 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
103a0 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
103b0 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
103c0 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
103d0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
103e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
103f0 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10400 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10410 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10420 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
10430 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
10440 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
10450 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
10460 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
10470 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
10480 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
10490 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
104a0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
104b0 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
104c0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
104d0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
104e0 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
104f0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10500 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10510 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10520 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10540 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10550 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
10580 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10590 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
105c0 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
105d0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
105e0 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10600 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
10610 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
10620 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
10630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10640 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
10650 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10660 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
10670 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10680 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
10690 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
106a0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
106b0 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
106c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
106d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
106e0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
106f0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
10700 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
10710 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
10720 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
10730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10740 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
10750 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
10760 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
10770 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73  r->jfd) );.  ass
10780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
10790 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
107a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
107b0 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65  ..  /* Calculate
107c0 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62   the length in b
107d0 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65  ytes and the che
107e0 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72  cksum of zMaster
107f0 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65   */.  for(nMaste
10800 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  r=0; zMaster[nMa
10810 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b  ster]; nMaster++
10820 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
10830 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
10840 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
10850 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
10860 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
10870 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
10880 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
10890 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
108a0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
108b0 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
108c0 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
108d0 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
108e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
108f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
10900 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
10910 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
10920 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
10930 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
10940 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
10950 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48  Pager);.  }.  iH
10960 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
10970 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
10980 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
10990 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20  er journal data 
109a0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
109b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
109c0 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  If.  ** an error
109d0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
109e0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
109f0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
10a00 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28  */.  if( (0 != (
10a10 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10a20 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10a30 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  drOff, PAGER_MJ_
10a40 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a  PGNO(pPager)))).
10a50 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10a60 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
10a70 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
10a80 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20  aster, nMaster, 
10a90 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20  iHdrOff+4))).   
10aa0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
10ab0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
10ac0 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10ad0 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  4+nMaster, nMast
10ae0 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  er))).   || (0 !
10af0 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10b00 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10b10 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10b20 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20  er+4, cksum))). 
10b30 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10b40 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10b50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
10b60 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69  urnalMagic, 8, i
10b70 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10b80 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
10b90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10bb0 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
10bc0 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
10bd0 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
10be0 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
10bf0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
10c00 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
10c10 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
10c20 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
10c30 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
10c40 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
10c50 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
10c60 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
10c70 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
10c80 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
10c90 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
10ca0 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
10cb0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
10cc0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
10cd0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
10ce0 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
10cf0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
10d00 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
10d10 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
10d20 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
10d30 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
10d40 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
10d50 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
10d60 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
10d70 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
10d80 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
10d90 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
10da0 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
10db0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
10dc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
10dd0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
10de0 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
10df0 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
10e00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
10e10 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
10e20 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
10e30 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
10e40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
10e50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10e60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
10e70 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
10e80 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
10e90 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
10ea0 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
10eb0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
10ec0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
10ed0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
10ee0 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
10ef0 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
10f00 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
10f10 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
10f20 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
10f30 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
10f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
10f60 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
10f70 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
10f80 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
10f90 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
10fa0 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
10fb0 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
10fc0 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
10fd0 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
10fe0 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
10ff0 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
11000 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
11010 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
11020 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
11030 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
11040 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
11050 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
11060 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11070 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
11080 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11090 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
110a0 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
110b0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61  er){.  sqlite3Ba
110c0 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
110d0 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
110e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
110f0 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ar(pPager->pPCac
11100 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  he);.}../*.** Fr
11110 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11120 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
11130 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
11140 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
11150 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
11160 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
11170 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
11180 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
11190 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
111a0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
111b0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
111c0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
111d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
111e0 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
111f0 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11200 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11220 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
11230 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
11240 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
11250 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11260 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11270 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
11280 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
11290 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
112a0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
112b0 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
112c0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
112d0 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
112e0 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
112f0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
11300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11310 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
11320 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
11330 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
11340 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
11350 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11360 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11370 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
11380 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
11390 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
113a0 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
113b0 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
113c0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
113d0 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
113e0 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
113f0 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
11400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
11410 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
11420 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
11430 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
11440 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
11450 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
11460 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
11470 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11480 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
11490 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
114a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
114b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
114c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
114d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
114e0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
114f0 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
11500 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
11510 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
11520 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
11530 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
11540 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
11550 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
11560 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
11570 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
11580 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
11590 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
115a0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
115b0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
115c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
115d0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
115e0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
115f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11610 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11620 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
11630 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11640 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a   mode and not.**
11650 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11660 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
11670 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65 20  it switches the 
11680 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f  pager to PAGER_O
11690 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a  PEN.** state..**
116a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
116b0 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
116c0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
116d0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
116e0 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65  ile is.** comple
116f0 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49  tely unlocked. I
11700 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
11710 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66  locked and the f
11720 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a  ile-system does.
11730 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74  ** not exhibit t
11740 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  he UNDELETABLE_W
11750 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74  HEN_OPEN propert
11760 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  y, the journal f
11770 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64  ile is.** closed
11780 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29   (if it is open)
11790 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
117a0 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52  ager is in ERROR
117b0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
117c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
117d0 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  led, the .** con
117e0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
117f0 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69 73  er cache are dis
11800 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73 77  carded before sw
11810 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20  itching back to 
11820 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61  .** the OPEN sta
11830 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  te. Regardless o
11840 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61  f whether the pa
11850 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11860 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e  ive-mode.** or n
11870 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ot, any journal 
11880 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65  file left in the
11890 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c   file-system wil
118a0 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20  l be treated.** 
118b0 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
118c0 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
118d0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
118e0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
118f0 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28  n.** is opened (
11900 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e  by this or by an
11910 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  y other connecti
11920 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on)..*/.static v
11930 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
11940 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11950 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11960 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11970 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20 20  R_READER .      
11980 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
11990 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a  te==PAGER_OPEN .
119a0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
119b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
119c0 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73  ERROR .  );..  s
119d0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
119e0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
119f0 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
11a00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
11a10 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  0;.  releaseAllS
11a20 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
11a30 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
11a40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
11a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
11a60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11a70 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
11a80 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
11a90 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
11aa0 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
11ab0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
11ac0 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OPEN;.  }else if
11ad0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
11ae0 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
11af0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b10 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   Error code retu
11b20 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c  rned by pagerUnl
11b30 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69  ockDb() */.    i
11b40 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28  nt iDc = isOpen(
11b50 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69  pPager->fd)?sqli
11b60 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
11b70 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
11b80 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f  r->fd):0;..    /
11b90 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
11ba0 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  ng system suppor
11bb0 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70  t deletion of op
11bc0 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20  en files, then. 
11bd0 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20     ** close the 
11be0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
11bf0 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
11c00 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f  atabase lock.  O
11c10 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
11c20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
11c30 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
11c40 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
11c50 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  t delete the fil
11c60 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f  e.    ** out fro
11c70 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
11c80 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
11c90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11ca0 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21  E_MEMORY   & 5)!
11cb0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11cc0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11cd0 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20  MODE_OFF      & 
11ce0 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11cf0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11d00 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
11d10 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11d20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11d30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
11d40 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  E   & 5)!=1 );. 
11d50 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11d60 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
11d70 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29  UNCATE & 5)==1 )
11d80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11d90 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11da0 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d  _PERSIST  & 5)==
11db0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  1 );.    if( 0==
11dc0 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
11dd0 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
11de0 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20  WHEN_OPEN).     
11df0 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a  || 1!=(pPager->j
11e00 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a  ournalMode & 5).
11e10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
11e20 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11e30 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
11e40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
11e50 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 45  ager is in the E
11e60 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
11e70 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63  he call to unloc
11e80 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  k the database. 
11e90 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73     ** file fails
11ea0 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65 6e  , set the curren
11eb0 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57  t lock to UNKNOW
11ec0 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20  N_LOCK. See the 
11ed0 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61  comment.    ** a
11ee0 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
11ef0 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43   for UNKNOWN_LOC
11f00 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
11f10 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73  tion of why this
11f20 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73  .    ** is neces
11f30 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
11f40 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63   rc = pagerUnloc
11f50 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c  kDb(pPager, NO_L
11f60 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
11f70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
11f80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11f90 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20  AGER_ERROR ){.  
11fa0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
11fb0 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  k = UNKNOWN_LOCK
11fc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11fd0 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  The pager state 
11fe0 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20 66  may be changed f
11ff0 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20  rom PAGER_ERROR 
12000 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65  to PAGER_OPEN he
12010 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75  re.    ** withou
12020 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65  t clearing the e
12030 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20  rror code. This 
12040 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d  is intentional -
12050 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a   the error.    *
12060 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65  * code is cleare
12070 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
12080 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f  reset in the blo
12090 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  ck below..    */
120a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
120b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
120c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
120d0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
120e0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
120f0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12100 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12110 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61  .  }..  /* If Pa
12130 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
12140 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
12150 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
12160 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
12170 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
12180 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
12190 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
121a0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
121b0 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63  pager,.  ** it c
121c0 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62  an safely move b
121d0 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ack to PAGER_OPE
121e0 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68 61  N state. This ha
121f0 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20  ppens in both.  
12200 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78  ** normal and ex
12210 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
12220 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mode..  */.  if(
12230 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12240 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12250 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
12260 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
12270 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
12280 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12290 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
122a0 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e;.    pPager->e
122b0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
122c0 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  EN;.    pPager->
122d0 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
122e0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  _OK;.  }..  pPag
122f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
12300 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
12310 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
12320 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
12330 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
12340 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12350 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
12360 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c   an IOERR or FUL
12370 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71  L error that req
12380 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67  uires.** the pag
12390 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  er to transition
123a0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
123b0 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f  state may ahve o
123c0 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ccurred..** The 
123d0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
123e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
123f0 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
12400 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a  re, the second .
12410 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  ** the error-cod
12420 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
12430 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
12440 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
12450 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  The .** value re
12460 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
12470 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
12480 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
12490 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
124a0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
124b0 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
124c0 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
124d0 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
124e0 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d  he.** IOERR sub-
124f0 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72  codes, the pager
12500 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f   enters the ERRO
12510 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12520 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
12530 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
12540 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20  .errCode. While 
12550 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e  the pager remain
12560 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
12570 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a  tate,.** all maj
12580 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  or API calls on 
12590 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69  the Pager will i
125a0 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
125b0 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
125c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52  .**.** The ERROR
125d0 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73   state indicates
125e0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
125f0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
12600 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
12610 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
12620 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
12630 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
12640 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
12650 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
12660 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
12670 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
12680 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
12690 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
126a0 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
126b0 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
126c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
126d0 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
126e0 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
126f0 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
12700 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
12710 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
12720 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
12730 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
12740 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12750 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
12760 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
12770 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
12780 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
12790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
127a0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
127b0 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
127c0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
127d0 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
127e0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
127f0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
12800 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
12810 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
12820 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
12830 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
12840 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
12850 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
12860 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
12870 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
12880 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12890 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20   PAGER_ERROR;.  
128a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
128b0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
128c0 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
128d0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
128e0 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  nPage);../*.** T
128f0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73  his routine ends
12900 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
12910 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
12920 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62   usually ended b
12930 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43  y .** either a C
12940 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
12950 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  ACK operation. T
12960 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
12970 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66  be called .** af
12980 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  ter rollback of 
12990 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f  a hot-journal, o
129a0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
129b0 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
129c0 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ng.** the journa
129d0 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e  l file or writin
129e0 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  g the very first
129f0 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
12a00 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65  of a.** database
12a10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
12a20 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
12a30 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
12a40 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
12a50 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73   state. If it is
12a60 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41   called.** in PA
12a70 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45  GER_NONE or PAGE
12a80 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61  R_SHARED state a
12a90 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64  nd the lock held
12aa0 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c   is less.** excl
12ab0 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53  usive than a RES
12ac0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69  ERVED lock, it i
12ad0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
12ae0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20   Otherwise, any 
12af0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
12b00 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a  s are released..
12b10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
12b20 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
12b30 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66  n, then it is "f
12b40 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20  inalized". Once 
12b50 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69  a journal .** fi
12b60 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  le has been fina
12b70 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20  lized it is not 
12b80 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
12b90 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  it to roll back 
12ba0 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  a .** transactio
12bb0 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62  n. Nor will it b
12bc0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
12bd0 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
12be0 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61   by this.** or a
12bf0 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ny other databas
12c00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78  e connection. Ex
12c10 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72  actly how a jour
12c20 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
12c30 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  .** depends on w
12c40 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
12c50 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
12c60 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
12c70 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  mode and.** the 
12c80 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d  current journal-
12c90 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72  mode (Pager.jour
12ca0 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20  nalMode value), 
12cb0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
12cc0 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12cd0 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a  =MEMORY.**     J
12ce0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
12cf0 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79  riptor is simply
12d00 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65   closed. This de
12d10 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20  stroys an .**   
12d20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72    in-memory jour
12d30 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  nal..**.**   jou
12d40 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41  rnalMode==TRUNCA
12d50 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  TE.**     Journa
12d60 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  l file is trunca
12d70 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ted to zero byte
12d80 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
12d90 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12da0 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54  PERSIST.**     T
12db0 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65  he first 28 byte
12dc0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
12dd0 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64   file are zeroed
12de0 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74  . This invalidat
12df0 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69  es.**     the fi
12e00 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
12e10 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20  er in the file, 
12e20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e  and hence the en
12e30 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  tire journal.** 
12e40 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76      file. An inv
12e50 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
12e60 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  e cannot be roll
12e70 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
12e80 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45   journalMode==DE
12e90 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20  LETE.**     The 
12ea0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12eb0 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
12ec0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
12ed0 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
12ee0 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67  *     If the pag
12ef0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
12f00 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
12f10 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20   this method of 
12f20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20  finalizing.**   
12f30 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
12f40 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  le is never used
12f50 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68  . Instead, if th
12f60 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  e journalMode is
12f70 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61  .**     DELETE a
12f80 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
12f90 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12fa0 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  e, the method de
12fb0 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a  scribed under.**
12fc0 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65       journalMode
12fd0 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65  ==PERSIST is use
12fe0 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
12ff0 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
13000 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c  al is finalized,
13010 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   the pager moves
13020 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
13030 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75   state..** If ru
13040 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63  nning in non-exc
13050 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20  lusive rollback 
13060 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f  mode, the lock o
13070 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a  n the file is .*
13080 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
13090 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  a SHARED_LOCK..*
130a0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
130b0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
130c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
130d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
130e0 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
130f0 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
13100 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
13110 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13120 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
13130 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
13140 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
13150 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
13160 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
13170 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
13180 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13190 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
131a0 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
131b0 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
131c0 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
131d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
131e0 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
131f0 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
13200 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
13210 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
13220 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
13230 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
13240 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
13250 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
13260 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
13270 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
13280 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
13290 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
132a0 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
132b0 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
132c0 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
132d0 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d  aster, int bComm
132e0 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  it){.  int rc = 
132f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
13300 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13310 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
13320 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
13330 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
13340 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13350 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13360 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
13370 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
13380 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
13390 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  if the pager doe
133a0 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70  s not have an op
133b0 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
133c0 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20  tion.  ** or at 
133d0 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
133e0 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63   lock. This func
133f0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
13400 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20  ed when there.  
13410 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  ** is no write-t
13420 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
13430 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44  e but a RESERVED
13440 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
13450 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e   is.  ** held un
13460 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74  der two circumst
13470 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ances:.  **.  **
13480 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75     1. After a su
13490 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75  ccessful hot-jou
134a0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
134b0 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  t is called with
134c0 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74  .  **      eStat
134d0 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e  e==PAGER_NONE an
134e0 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
134f0 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20  VE_LOCK..  **.  
13500 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e  **   2. If a con
13510 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63  nection with loc
13520 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
13530 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ive holding an E
13540 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20  XCLUSIVE .  **  
13550 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65      lock switche
13560 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e  s back to lockin
13570 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e  g_mode=normal an
13580 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20  d then executes 
13590 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64  a.  **      read
135a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68  -transaction, th
135b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
135c0 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74  alled with eStat
135d0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
135e0 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65  .  **      and e
135f0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13600 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65  LOCK when the re
13610 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
13620 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20  s closed..  */. 
13630 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
13640 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
13650 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
13660 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
13670 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
13680 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
13690 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45  tate<PAGER_WRITE
136a0 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67  R_LOCKED && pPag
136b0 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56  er->eLock<RESERV
136c0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
136d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
136e0 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41  .  }..  releaseA
136f0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
13700 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
13710 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13720 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
13730 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
13740 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
13750 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13760 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
13770 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
13780 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
13790 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
137a0 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
137b0 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
137c0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
137d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
137e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
137f0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13800 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
13810 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
13820 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
13830 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
13840 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13850 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13860 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
13870 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
13880 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13890 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
138a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
138b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
138c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
138d0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
138e0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
138f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
13900 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
13910 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
13920 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13930 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13940 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
13950 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
13960 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13970 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
13980 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
13990 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
139a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
139b0 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
139c0 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
139d0 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
139e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
139f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
13a00 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
13a10 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
13a20 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
13a30 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
13a40 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
13a50 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
13a60 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
13a70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
13a80 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
13a90 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
13aa0 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
13ab0 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
13ac0 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
13ad0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
13ae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
13af0 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
13b00 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
13b10 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
13b20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
13b30 65 6c 65 74 65 20 3d 20 28 21 70 50 61 67 65 72  elete = (!pPager
13b40 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 73 71  ->tempFile && sq
13b50 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73  lite3JournalExis
13b60 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29  ts(pPager->jfd))
13b70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13b90 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13ba0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
13bb0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
13bc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13bd0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13be0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
13bf0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
13c00 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13c10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13c20 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
13c30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
13c40 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
13c50 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
13c60 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
13c70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
13c80 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
13c90 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
13ca0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
13cb0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
13cc0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
13cd0 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
13ce0 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
13cf0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13d00 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
13d10 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
13d20 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
13d30 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
13d40 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
13d50 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
13d60 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61 67    PgHdr *p = pag
13d70 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
13d80 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 1);.    if( p 
13d90 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65  ){.      p->page
13da0 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
13db0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
13dc0 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  f(p);.    }.  }.
13dd0 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
13de0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
13df0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13e00 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
13e10 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
13e20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
13e30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13e40 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
13e50 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
13e60 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
13e70 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
13e80 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
13e90 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
13ea0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
13eb0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
13ec0 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
13ed0 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
13ee0 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
13ef0 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
13f00 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
13f10 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
13f20 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
13f30 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
13f40 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
13f50 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
13f60 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
13f70 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
13f80 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
13f90 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
13fa0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
13fb0 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
13fc0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
13fd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13fe0 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
13ff0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
14000 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
14010 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
14020 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
14030 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
14040 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
14050 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
14060 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
14070 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14080 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
14090 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
140a0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
140b0 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
140c0 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
140d0 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
140e0 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
140f0 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
14100 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
14110 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
14120 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
14130 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
14140 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
14150 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
14160 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
14170 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
14180 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
14190 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
141a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
141b0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
141c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
141d0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
141e0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
141f0 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
14200 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  );.  }..  if( !p
14210 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
14220 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
14230 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
14240 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
14250 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
14260 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
14270 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
14280 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
14290 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
142a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
142b0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
142c0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
142d0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
142e0 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
142f0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14300 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14310 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
14320 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
14330 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
14340 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14350 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
14360 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
14370 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
14380 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14390 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
143a0 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
143b0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
143c0 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
143d0 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
143e0 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
143f0 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14400 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14410 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14420 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
14430 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
14440 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
14450 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14460 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
14470 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
14480 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
14490 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
144a0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
144b0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
144c0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
144d0 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
144e0 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
144f0 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
14500 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
14510 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
14520 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
14530 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
14540 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
14550 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
14560 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
14570 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
14580 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
14590 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
145a0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
145b0 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
145c0 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
145d0 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
145e0 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
145f0 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
14600 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14610 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
14620 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
14630 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
14640 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
14650 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
14660 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
14670 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
14680 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14690 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
146a0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
146b0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
146c0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
146d0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
146e0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
146f0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
14700 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
14720 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14740 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
14750 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
14760 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
14770 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
14780 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14790 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
147a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
147b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
147c0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
147d0 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
147e0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
147f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
14800 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
14810 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
14820 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
14830 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
14840 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
14850 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
14860 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
14870 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
14880 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
14890 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
148a0 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
148b0 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
148c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
148d0 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
148e0 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
148f0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
14900 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
14910 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
14920 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
14930 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
14940 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
14950 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
14960 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
14970 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
14980 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
14990 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
149a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
149b0 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
149c0 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
149d0 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
149e0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
149f0 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
14a00 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
14a10 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
14a20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
14a30 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
14a40 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
14a50 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
14a60 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
14a70 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
14a80 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
14a90 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
14aa0 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
14ab0 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
14ac0 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
14ad0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
14ae0 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
14af0 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
14b00 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
14b10 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
14b20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
14b30 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
14b40 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
14b50 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
14b60 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
14b70 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
14b80 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
14b90 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
14ba0 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
14bb0 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
14bc0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
14bd0 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
14be0 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
14bf0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
14c00 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
14c10 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
14c20 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
14c30 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
14c40 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
14c50 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
14c60 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
14c70 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
14c80 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
14c90 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
14ca0 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
14cb0 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
14cc0 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
14cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
14ce0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
14cf0 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
14d00 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
14d10 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
14d20 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
14d30 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
14d40 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
14d50 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
14d60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14d70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
14d80 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
14d90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
14da0 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
14db0 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
14dc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
14df0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
14e00 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
14e10 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
14e20 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
14e30 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
14e40 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
14e50 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
14e60 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
14e70 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
14e80 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
14e90 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
14ea0 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
14eb0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
14ec0 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
14ed0 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
14ee0 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
14ef0 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
14f00 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
14f10 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
14f20 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
14f30 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
14f40 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
14f50 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
14f60 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
14f70 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  l..**.** The mai
14f80 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
14f90 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d  al uses checksum
14fa0 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
14fb0 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a  t journal does .
14fc0 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ** not..**.** If
14fd0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
14fe0 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
14ff0 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
15000 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15010 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
15020 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
15030 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
15040 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
15050 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
15060 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
15070 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15080 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
15090 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
150a0 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
150b0 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
150c0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
150d0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
150e0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
150f0 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
15100 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
15110 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
15120 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
15130 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
15140 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
15150 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
15160 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
15170 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
15180 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
15190 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
151a0 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
151b0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
151c0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
151d0 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
151e0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
151f0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15200 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
15210 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
15220 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
15230 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
15240 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
15250 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
15260 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
15270 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
15280 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
15290 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
152a0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
152b0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
152c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
152d0 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
152e0 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
152f0 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15300 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
15310 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
15320 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
15330 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
15340 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
15350 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
15360 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
15370 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
15380 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
15390 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
153a0 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
153b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
153c0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
153d0 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
153e0 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
153f0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15400 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
15410 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
15420 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
15430 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
15440 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
15450 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
15460 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
15470 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
15480 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15490 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
154a0 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
154b0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
154c0 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
154d0 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
154e0 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
154f0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
15500 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
15510 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
15520 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
15530 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
15540 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
15550 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
15560 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15570 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
15580 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
15590 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
155a0 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
155b0 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66  ck */.  i64 *pOf
155c0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
155d0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
155e0 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
155f0 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  yback */.  Bitve
15600 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20  c *pDone,       
15610 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
15620 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
15630 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
15640 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
15650 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
15660 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
15670 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
15680 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
15690 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20  int isSavepnt   
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
156b0 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
156c0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
156d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
156e0 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15700 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
15710 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
15720 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15740 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
15750 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
15760 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
15770 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15790 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
157a0 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
157b0 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ng */.  char *aD
157c0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
157d0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
157e0 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
157f0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
15800 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
15810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15820 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
15830 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
15840 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
15850 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  isSynced;       
15860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15870 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67  e if journal pag
15880 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a  e is synced */..
15890 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
158a0 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
158b0 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
158c0 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
158d0 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
158e0 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
158f0 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
15900 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
15910 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
15920 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
15930 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
15940 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
15950 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
15960 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
15970 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
15980 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
15990 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
159a0 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
159b0 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
159c0 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
159d0 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
159e0 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
159f0 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
15a00 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
15a10 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
15a20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
15a30 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
15a40 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
15a50 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69  pnt) );..  /* Ei
15a60 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69  ther the state i
15a70 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
15a80 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
15a90 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74  EMOD (a transact
15aa0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76  ion .  ** or sav
15ab0 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15ac0 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75  done at the requ
15ad0 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  est of the calle
15ae0 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20  r) or this is.  
15af0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
15b00 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74   rollback. If it
15b10 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15b20 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  l rollback, the 
15b30 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e  pager.  ** is in
15b40 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20   state OPEN and 
15b50 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49  holds an EXCLUSI
15b60 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75  VE lock. Hot-jou
15b70 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  rnal rollback.  
15b80 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72  ** only reads fr
15b90 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
15ba0 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62  nal, not the sub
15bb0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
15bc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15bd0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
15be0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
15bf0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
15c00 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
15c10 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e  OPEN && pPager->
15c20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
15c30 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73  _LOCK).  );.  as
15c40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15c50 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
15c60 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69  ER_CACHEMOD || i
15c70 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20  sMainJrnl );..  
15c80 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
15c90 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
15ca0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
15cb0 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
15cc0 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
15cd0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
15ce0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
15cf0 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
15d00 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
15d10 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
15d20 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
15d30 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
15d40 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
15d50 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
15d60 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
15d70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
15d80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
15d90 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
15da0 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  jfd, (u8*)aData,
15db0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15dc0 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29  e, (*pOffset)+4)
15dd0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15de0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
15df0 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d  c;.  *pOffset +=
15e00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15e10 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72  e + 4 + isMainJr
15e20 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nl*4;..  /* Sani
15e30 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
15e40 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
15e50 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
15e60 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
15e70 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
15e80 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
15e90 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
15ea0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
15eb0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
15ec0 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
15ed0 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
15ee0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
15ef0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
15f00 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
15f10 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
15f20 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
15f30 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
15f40 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
15f50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
15f60 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
15f70 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
15f80 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
15f90 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b  t( !isSavepnt );
15fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15fb0 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
15fc0 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
15fd0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
15fe0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
15ff0 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
16000 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16010 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
16020 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
16030 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
16040 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
16050 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
16060 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
16070 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
16080 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
16090 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
160a0 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63  , (u8*)aData)!=c
160b0 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
160c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
160d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
160e0 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68  * If this page h
160f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
16100 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72 65  played by before
16110 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
16120 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
16130 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
16140 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
16150 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
16160 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
16170 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
16180 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16190 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
161a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
161b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
161c0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
161d0 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
161e0 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
161f0 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
16200 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
16210 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
16220 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
16230 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
16240 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
16250 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
16260 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
16270 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
16280 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16290 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
162a0 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
162b0 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
162c0 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
162d0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
162e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
162f0 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
16300 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
16310 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
16320 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
16330 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
16340 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
16350 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
16360 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
16370 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
16380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16390 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
163a0 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
163b0 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
163c0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
163d0 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
163e0 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
163f0 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
16400 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
16410 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
16420 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
16430 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
16440 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
16450 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16460 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
16470 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
16480 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16490 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
164a0 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
164b0 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
164c0 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
164d0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
164e0 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
164f0 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
16500 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
16510 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
16520 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
16530 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
16540 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
16550 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
16560 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
16570 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
16580 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
16590 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
165a0 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
165b0 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
165c0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
165d0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
165e0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
165f0 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
16600 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
16610 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
16620 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
16630 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
16640 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
16650 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
16660 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
16670 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
16680 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
16690 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
166a0 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
166b0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
166c0 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
166d0 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
166e0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
166f0 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
16700 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
16710 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
16720 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
16730 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
16740 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
16750 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
16760 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
16770 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
16780 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
16790 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
167a0 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
167b0 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
167c0 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
167d0 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
167e0 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
167f0 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
16800 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
16810 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
16820 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
16830 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
16840 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
16850 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
16860 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
16870 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
16880 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
16890 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
168a0 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
168b0 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
168c0 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
168d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
168e0 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
168f0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
16900 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
16910 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
16920 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
16930 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
16940 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
16950 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16960 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
16970 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16980 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
16990 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
169a0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
169b0 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
169c0 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
169d0 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
169e0 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
169f0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
16a00 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
16a10 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
16a20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
16a30 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
16a40 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
16a50 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
16a60 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
16a70 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
16a80 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
16a90 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
16aa0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
16ab0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
16ac0 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
16ad0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
16ae0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
16af0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
16b00 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
16b10 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
16b20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
16b30 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
16b40 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  ==0 );.  PAGERTR
16b50 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
16b60 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
16b70 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
16b80 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
16b90 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
16ba0 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
16bb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
16bc0 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20  u8*)aData),.    
16bd0 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72         (isMainJr
16be0 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c  nl?"main-journal
16bf0 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29  ":"sub-journal")
16c00 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d  .  ));.  if( isM
16c10 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69  ainJrnl ){.    i
16c20 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  sSynced = pPager
16c30 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f  ->noSync || (*pO
16c40 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d  ffset <= pPager-
16c50 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
16c60 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e  }else{.    isSyn
16c70 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c  ced = (pPg==0 ||
16c80 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20   0==(pPg->flags 
16c90 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
16ca0 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  C));.  }.  if( i
16cb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
16cc0 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
16cd0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16ce0 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
16cf0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
16d00 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26  AGER_OPEN).   &&
16d10 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
16d20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
16d30 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
16d40 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
16d50 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
16d60 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
16d70 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
16d80 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
16d90 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
16da0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
16db0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
16dc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
16dd0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
16de0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
16df0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
16e00 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
16e10 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
16e20 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
16e30 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
16e40 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
16e50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
16e60 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
16e70 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
16e80 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
16e90 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
16ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
16eb0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
16ec0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
16ed0 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
16ee0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
16ef0 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
16f00 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
16f10 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
16f20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
16f30 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
16f40 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
16f50 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
16f60 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
16f70 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
16f80 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
16f90 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
16fa0 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
16fb0 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
16fc0 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
16fd0 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
16fe0 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
16ff0 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
17000 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
17010 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
17020 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
17030 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
17040 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
17050 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
17060 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
17070 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
17080 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
17090 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
170a0 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
170b0 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
170c0 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
170d0 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
170e0 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
170f0 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
17100 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
17110 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17120 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
17130 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
17140 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
17150 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
17160 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
17170 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
17180 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17190 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
171a0 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
171b0 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
171c0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
171d0 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
171e0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
171f0 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
17200 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
17210 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
17220 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
17230 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
17240 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
17250 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
17260 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
17270 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
17280 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
17290 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
172a0 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
172b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
172c0 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
172d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
172e0 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  oNotSpill==0 );.
172f0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
17300 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63  tSpill++;.    rc
17310 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
17320 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
17330 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  gno, &pPg, 1);. 
17340 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
17350 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31  r->doNotSpill==1
17360 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
17370 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20  doNotSpill--;.  
17380 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17390 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
173a0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
173b0 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
173c0 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
173d0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
173e0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
173f0 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
17400 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
17410 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
17420 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
17430 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
17440 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
17450 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
17460 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
17470 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
17480 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
17490 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
174a0 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
174b0 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
174c0 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
174d0 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
174e0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
174f0 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
17500 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
17510 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
17520 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
17530 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
17540 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
17550 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
17560 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
17570 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
17580 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17590 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
175a0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
175b0 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
175c0 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
175d0 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
175e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
175f0 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
17600 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
17610 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
17620 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
17630 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
17640 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
17650 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
17660 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
17670 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
17680 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
17690 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
176a0 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
176b0 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
176c0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
176d0 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
176e0 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
176f0 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
17700 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
17710 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
17720 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  abase..      **.
17730 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
17740 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
17750 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
17760 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
17770 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
17780 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
17790 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
177a0 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
177b0 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
177c0 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
177d0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
177e0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
177f0 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
17800 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
17810 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
17820 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
17830 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
17840 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
17850 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
17860 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
17870 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
17880 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
17890 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
178a0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
178b0 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
178c0 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
178d0 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
178e0 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
178f0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
17900 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
17910 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
17920 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
17930 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
17940 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
17950 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
17960 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
17970 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
17980 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
17990 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
179a0 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
179b0 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
179c0 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
179d0 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
179e0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
179f0 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
17a00 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
17a10 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
17a20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
17a30 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
17a40 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
17a50 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
17a60 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
17a70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17a80 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
17a90 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
17aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
17ab0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
17ac0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
17ad0 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
17ae0 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pPg);..    /* If
17af0 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
17b00 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
17b10 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
17b20 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
17b30 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
17b40 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
17b50 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
17b60 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
17b70 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
17b80 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
17b90 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
17ba0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
17bb0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
17bc0 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
17bd0 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
17be0 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
17bf0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
17c00 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
17c10 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
17c20 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69  NOMEM);.    sqli
17c30 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
17c40 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
17c50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17c60 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
17c70 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
17c80 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
17c90 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
17ca0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
17cb0 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
17cc0 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
17cd0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
17ce0 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
17cf0 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
17d00 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
17d10 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
17d20 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
17d30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17d40 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
17d50 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
17d60 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
17d70 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
17d80 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
17d90 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
17da0 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
17db0 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
17dc0 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
17dd0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d  ..**.** When a m
17de0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17df0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69  le is created, i
17e00 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  t is populated w
17e10 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a  ith the names .*
17e20 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20  * of all of its 
17e30 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20  child journals, 
17e40 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65  one after anothe
17e50 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  r, formatted as 
17e60 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65  utf-8 .** encode
17e70 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20  d text. The end 
17e80 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  of each child jo
17e90 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61  urnal file is ma
17ea0 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20  rked with a .** 
17eb0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
17ec0 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e  yte (0x00). i.e.
17ed0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
17ee0 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72  ents of a master
17ef0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
17f00 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
17f10 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f  on involving two
17f20 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74   databases might
17f30 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68   be:.**.**   "/h
17f40 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f  ome/bill/a.db-jo
17f50 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62  urnal\x00/home/b
17f60 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/b.db-journal
17f70 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61  \x00".**.** A ma
17f80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
17f90 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65  e may only be de
17fa0 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f  leted once all o
17fb0 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20  f its child .** 
17fc0 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65  journals have be
17fd0 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
17fe0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
17ff0 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f  ion reads the co
18000 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
18010 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
18020 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72  e into .** memor
18030 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f  y and loops thro
18040 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20  ugh each of the 
18050 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61  child journal na
18060 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68  mes. For.** each
18070 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20   child journal, 
18080 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a  it checks if:.**
18090 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
180a0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69  hild journal exi
180b0 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a  sts, and if so.*
180c0 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
180d0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  ld journal conta
180e0 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  ins a reference 
180f0 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  to master journa
18100 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a  l .**     file z
18110 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  Master.**.** If 
18120 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  a child journal 
18130 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61  can be found tha
18140 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f  t matches both o
18150 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  f the criteria.*
18160 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75  * above, this fu
18170 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
18180 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
18190 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  thing. Otherwise
181a0 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
181b0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
181c0 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65  n be found, file
181d0 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65   zMaster is dele
181e0 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
181f0 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e  file-system usin
18200 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
18210 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
18220 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e   IO error within
18230 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
18240 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
18250 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
18260 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
18270 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20  cates memory by 
18280 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d  calling sqlite3M
18290 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61  alloc(). If an a
182a0 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69  llocation.** fai
182b0 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
182c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
182d0 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49  herwise, if no I
182e0 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  O or malloc erro
182f0 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51  rs .** occur, SQ
18300 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18310 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ned..**.** TODO:
18320 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
18330 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c  llocates a singl
18340 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
18350 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65  y to load.** the
18360 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
18370 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
18380 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
18390 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20  s could be.** a 
183a0 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79  couple of kiloby
183b0 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65  tes or so - pote
183c0 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74  ntially larger t
183d0 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  han the page .**
183e0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
183f0 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
18400 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
18410 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
18420 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
18430 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
18440 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
18450 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
18460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
18470 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
18480 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
18490 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  ter;    /* Mallo
184a0 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  c'd master-journ
184b0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
184c0 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
184d0 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20  file *pJournal; 
184e0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68    /* Malloc'd ch
184f0 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild-journal file
18500 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18510 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
18520 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
18530 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
18540 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18550 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
18560 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
18570 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
18580 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
18590 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
185a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
185b0 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75  inter to one jou
185c0 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66  rnal within MJ f
185d0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
185e0 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
185f0 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
18600 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20  old MJ filename 
18610 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66  from a journal f
18620 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ile */.  int nMa
18630 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
18640 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
18650 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
18660 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20  to zMasterPtr[] 
18670 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
18680 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
18690 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
186a0 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
186b0 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
186c0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
186d0 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
186e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
186f0 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
18700 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
18710 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
18720 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
18730 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
18740 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
18750 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
18760 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
18770 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
18780 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
18790 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
187a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
187b0 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  lse{.    const i
187c0 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
187d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
187e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
187f0 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
18800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18810 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
18820 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
18830 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
18840 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18850 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
18860 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64  _out;..  /* Load
18870 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
18880 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18890 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
188a0 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71  ned from.  ** sq
188b0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
188c0 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
188d0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
188e0 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20     Also obtain. 
188f0 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73   ** sufficient s
18900 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72  pace (in zMaster
18910 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65  Ptr) to hold the
18920 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72   names of master
18930 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
18940 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72  les extracted fr
18950 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62  om regular rollb
18960 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20  ack-journals..  
18970 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
18980 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73  3OsFileSize(pMas
18990 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
189a0 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
189b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
189c0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
189d0 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20  .  nMasterPtr = 
189e0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
189f0 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  +1;.  zMasterJou
18a00 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61  rnal = sqlite3Ma
18a10 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65  lloc((int)nMaste
18a20 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
18a30 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
18a40 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
18a50 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
18a60 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
18a70 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18a80 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  ut;.  }.  zMaste
18a90 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
18aa0 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
18ab0 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d  urnal+1];.  rc =
18ac0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
18ad0 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
18ae0 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
18af0 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
18b00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18b10 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
18b20 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61  aster_out;.  zMa
18b30 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
18b40 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b  terJournal] = 0;
18b50 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a  ..  zJournal = z
18b60 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
18b70 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
18b80 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
18b90 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
18ba0 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73   ){.    int exis
18bb0 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ts;.    rc = sql
18bc0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
18bd0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
18be0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
18bf0 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
18c00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18c10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
18c20 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18c30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78      }.    if( ex
18c40 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ists ){.      /*
18c50 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
18c60 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
18c70 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
18c80 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
18c90 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
18ca0 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
18cb0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
18cc0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
18cd0 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
18ce0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
18cf0 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
18d00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
18d10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
18d20 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c   c;.      int fl
18d30 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
18d40 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
18d50 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
18d60 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20  RNAL);.      rc 
18d70 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
18d80 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
18d90 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
18da0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
18db0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18dc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
18dd0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
18de0 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
18df0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
18e00 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
18e10 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
18e20 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tr);.      sqlit
18e30 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e  e3OsClose(pJourn
18e40 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
18e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18e60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
18e70 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
18e80 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a    }..      c = z
18e90 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20  MasterPtr[0]!=0 
18ea0 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
18eb0 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
18ec0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29  0;.      if( c )
18ed0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
18ee0 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
18ef0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
18f00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18f10 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
18f20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18f30 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
18f40 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b  }.    zJournal +
18f50 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
18f60 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  30(zJournal)+1);
18f70 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33  .  }. .  sqlite3
18f80 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
18f90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18fa0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
18fb0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
18fc0 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71  master_out:.  sq
18fd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
18fe0 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
18ff0 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( pMaster ){.   
19000 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19010 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
19020 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a  sert( !isOpen(pJ
19030 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73  ournal) );.    s
19040 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
19050 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
19060 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
19070 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
19080 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65  s used to change
19090 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   the actual size
190a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
190b0 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65   .** file in the
190c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68   file-system. Th
190d0 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
190e0 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
190f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  a transaction,.*
19100 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  * or rolling bac
19110 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
19120 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69  (including rolli
19130 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
19140 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  urnal)..**.** If
19150 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
19160 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  se file is not o
19170 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65  pen, or the page
19180 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68  r is not in eith
19190 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f  er.** DBMOD or O
191a0 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20  PEN state, this 
191b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
191c0 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
191d0 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20  the size .** of 
191e0 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e  the file is chan
191f0 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
19200 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
19210 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
19220 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  ). .** If the fi
19230 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  le on disk is cu
19240 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
19250 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
19260 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
19270 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
19280 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
19290 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
192a0 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74  , it might might
192b0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
192c0 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
192d0 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
192e0 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
192f0 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
19300 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
19310 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
19320 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
19330 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
19340 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
19350 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
19360 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
19370 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
19380 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
19390 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
193a0 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
193b0 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
193c0 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
193d0 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
193e0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
193f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19400 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
19410 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
19420 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
19430 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
19440 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
19450 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
19460 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
19470 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
19480 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
19490 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
194a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
194b0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
194c0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
194d0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
194e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
194f0 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44  tate!=PAGER_READ
19500 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69  ER );.  .  if( i
19510 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
19520 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  ) .   && (pPager
19530 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
19540 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
19550 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
19560 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29  PAGER_OPEN) .  )
19570 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
19580 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
19590 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d      int szPage =
195a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
195b0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
195c0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
195d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
195e0 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20      /* TODO: Is 
195f0 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50  it safe to use P
19600 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20  ager.dbFileSize 
19610 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20  here? */.    rc 
19620 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
19630 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
19640 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
19650 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50     newSize = szP
19660 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  age*(i64)nPage;.
19670 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19680 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
19690 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
196a0 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
196b0 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
196c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
196d0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
196e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
196f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
19700 73 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53  se if( (currentS
19710 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77  ize+szPage)<=new
19720 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
19730 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61  char *pTmp = pPa
19740 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
19750 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
19760 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b  Tmp, 0, szPage);
19770 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19780 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
19790 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69  ge) == currentSi
197a0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ze );.        te
197b0 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
197c0 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72  -szPage) >  curr
197d0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
197e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
197f0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
19800 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c  d, pTmp, szPage,
19810 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29   newSize-szPage)
19820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19840 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
19850 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
19860 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
19870 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19880 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19890 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69   Return a saniti
198a0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  zed version of t
198b0 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f  he sector-size o
198c0 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e  f OS file pFile.
198d0 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
198e0 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65  alue is guarante
198f0 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65  ed to lie betwee
19900 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43  n 32 and MAX_SEC
19910 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74  TOR_SIZE..*/.int
19920 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
19930 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
19940 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69  *pFile){.  int i
19950 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  Ret = sqlite3OsS
19960 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29  ectorSize(pFile)
19970 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20  ;.  if( iRet<32 
19980 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31  ){.    iRet = 51
19990 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  2;.  }else if( i
199a0 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  Ret>MAX_SECTOR_S
199b0 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  IZE ){.    asser
199c0 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  t( MAX_SECTOR_SI
199d0 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69  ZE>=512 );.    i
199e0 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52  Ret = MAX_SECTOR
199f0 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _SIZE;.  }.  ret
19a00 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn iRet;.}../*.
19a10 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
19a20 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
19a30 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
19a40 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
19a50 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
19a60 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
19a70 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
19a80 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
19a90 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
19aa0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
19ab0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
19ac0 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
19ad0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
19ae0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
19af0 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
19b00 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
19b10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19b20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
19b30 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
19b40 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
19b50 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
19b60 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
19b70 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
19b80 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
19b90 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
19ba0 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
19bb0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
19bc0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
19bd0 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
19be0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
19bf0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
19c00 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
19c10 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
19c20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
19c30 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
19c40 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
19c50 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
19c60 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
19c70 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
19c80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
19c90 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
19ca0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
19cb0 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
19cc0 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
19cd0 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
19ce0 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
19cf0 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
19d00 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
19d10 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
19d20 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
19d30 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
19d40 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
19d50 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
19d60 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
19d70 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
19d80 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
19d90 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
19da0 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
19db0 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
19dc0 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
19dd0 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
19de0 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
19df0 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
19e00 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
19e10 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
19e20 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
19e30 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
19e40 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
19e50 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
19e60 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
19e70 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
19e80 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
19e90 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
19ea0 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
19eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19ec0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
19ed0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19ee0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
19ef0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
19f00 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
19f10 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
19f20 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
19f30 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
19f40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
19f50 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19f70 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
19f80 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
19f90 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
19fa0 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
19fb0 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
19fc0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
19fd0 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
19fe0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
19ff0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
1a000 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
1a010 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
1a020 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
1a030 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
1a040 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
1a050 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
1a060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
1a070 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1a080 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  = sqlite3SectorS
1a090 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
1a0a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
1a0b0 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
1a0c0 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
1a0d0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
1a0e0 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
1a0f0 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1a100 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
1a110 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
1a120 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
1a130 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1a140 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
1a150 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
1a160 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
1a170 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
1a180 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
1a190 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1a1a0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1a1b0 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1a1c0 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
1a1d0 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
1a1e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1a1f0 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
1a200 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1a210 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1a220 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
1a230 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
1a240 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
1a250 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
1a260 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1a270 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1a280 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
1a290 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
1a2a0 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
1a2b0 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
1a2c0 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
1a2d0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1a2e0 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
1a2f0 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
1a300 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
1a310 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1a320 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
1a330 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1a340 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1a350 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
1a360 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
1a370 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
1a380 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1a390 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
1a3a0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1a3b0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a3c0 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
1a3d0 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
1a3e0 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
1a3f0 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
1a400 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
1a410 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
1a420 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
1a430 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
1a440 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
1a450 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
1a460 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
1a470 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
1a480 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
1a490 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
1a4a0 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
1a4b0 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
1a4c0 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
1a4d0 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
1a4e0 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
1a4f0 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
1a500 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
1a510 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1a520 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
1a530 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
1a540 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1a550 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
1a560 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
1a570 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
1a580 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
1a590 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
1a5a0 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
1a5b0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
1a5c0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
1a5d0 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
1a5e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1a5f0 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
1a600 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
1a610 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
1a620 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1a630 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
1a640 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
1a650 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
1a660 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1a670 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
1a680 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
1a690 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
1a6a0 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
1a6b0 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
1a6c0 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
1a6d0 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
1a6e0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1a6f0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
1a700 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1a710 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
1a720 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
1a730 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
1a740 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
1a750 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
1a760 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
1a770 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
1a780 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
1a790 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
1a7a0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1a7b0 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1a7c0 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
1a7d0 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
1a7e0 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
1a7f0 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
1a800 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
1a810 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
1a820 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1a830 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
1a840 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
1a850 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
1a860 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
1a870 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
1a880 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
1a890 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
1a8a0 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
1a8b0 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
1a8c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1a8d0 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
1a8e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1a8f0 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
1a900 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
1a910 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
1a920 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
1a930 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
1a940 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
1a950 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
1a960 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1a970 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1a980 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
1a990 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
1a9a0 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
1a9b0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1a9c0 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
1a9d0 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
1a9e0 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
1a9f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1aa00 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
1aa10 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1aa20 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
1aa30 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
1aa40 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1aa50 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
1aa60 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
1aa70 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1aa80 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
1aa90 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
1aaa0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
1aab0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
1aac0 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
1aad0 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1aae0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1aaf0 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
1ab00 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
1ab10 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
1ab20 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
1ab30 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
1ab40 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
1ab50 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
1ab60 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
1ab70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
1ab80 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
1ab90 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
1aba0 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
1abb0 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
1abc0 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
1abd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1abe0 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
1abf0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
1ac00 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
1ac10 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1ac20 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
1ac30 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1ac40 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1ac50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ac60 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1ac70 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
1ac80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ac90 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
1aca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1acb0 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
1acc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1acd0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1ace0 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
1acf0 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1ad00 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1ad10 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
1ad20 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
1ad30 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1ad40 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1ad50 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
1ad60 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1ad70 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
1ad80 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1ad90 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1ada0 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
1adb0 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
1adc0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
1add0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
1ade0 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
1adf0 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
1ae00 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
1ae10 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
1ae20 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
1ae30 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
1ae40 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
1ae50 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
1ae60 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
1ae70 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
1ae80 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
1ae90 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
1aea0 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
1aeb0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1aec0 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20  >jfd) );.  rc = 
1aed0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1aee0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1aef0 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
1af00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1af10 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1af20 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
1af30 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
1af40 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
1af50 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
1af60 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
1af70 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
1af80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1af90 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
1afa0 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
1afb0 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
1afc0 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
1afd0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
1afe0 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
1aff0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
1b000 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
1b010 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
1b020 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  Technically the 
1b030 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20  following is an 
1b040 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74  error because it
1b050 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20   assumes that.  
1b060 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e  ** buffer Pager.
1b070 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78  pTmpSpace is (mx
1b080 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65  Pathname+1) byte
1b090 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65  s or larger. i.e
1b0a0 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61  . that.  ** (pPa
1b0b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d  ger->pageSize >=
1b0c0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1b0d0 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73  xPathname+1). Us
1b0e0 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20  ing os_unix.c,. 
1b0f0 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20   **  mxPathname 
1b100 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73  is 512, which is
1b110 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1b120 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62   minimum allowab
1b130 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f  le value.  ** fo
1b140 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f  r pageSize..  */
1b150 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
1b160 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1b170 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1b180 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1b190 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1b1a0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1b1b0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66  athname+1);.  if
1b1c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b1d0 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b  && zMaster[0] ){
1b1e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b1f0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1b200 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
1b210 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1b220 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  res);.  }.  zMas
1b230 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ter = 0;.  if( r
1b240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1b250 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !res ){.    goto
1b260 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1b270 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
1b280 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e  rnalOff = 0;.  n
1b290 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1b2a0 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69  isHot;..  /* Thi
1b2b0 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
1b2c0 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20  s either when a 
1b2d0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
1b2e0 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f   or .  ** pager_
1b2f0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1b300 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  e() call returns
1b310 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
1b320 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a  an IO error .  *
1b330 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a  * occurs. .  */.
1b340 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1b350 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
1b360 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
1b370 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
1b380 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
1b390 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
1b3a0 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
1b3b0 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
1b3c0 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
1b3d0 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
1b3e0 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
1b3f0 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
1b400 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61   process must ha
1b410 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ve failed while 
1b420 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
1b430 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
1b440 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
1b450 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
1b460 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
1b470 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
1b480 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69  nalHdr(pPager, i
1b490 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  sHot, szJ, &nRec
1b4a0 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
1b4b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b4c0 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
1b4d0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1b4e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1b4f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1b500 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
1b510 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
1b520 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1b530 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1b540 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
1b550 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1b560 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
1b570 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
1b580 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
1b590 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
1b5a0 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
1b5b0 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
1b5c0 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
1b5d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
1b5e0 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
1b5f0 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
1b600 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1b610 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
1b620 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
1b630 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1b640 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
1b650 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b660 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b670 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1b680 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
1b690 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
1b6a0 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f  ((szJ - JOURNAL_
1b6b0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
1b6c0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1b6d0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1b6e0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1b6f0 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
1b700 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
1b710 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
1b720 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
1b730 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
1b740 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
1b750 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
1b760 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
1b770 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
1b780 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
1b790 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1b7a0 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
1b7b0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1b7c0 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
1b7d0 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
1b7e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1b7f0 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
1b800 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
1b810 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
1b820 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1b830 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
1b840 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
1b850 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
1b860 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
1b870 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67   ** When rolling
1b880 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72   back a hot jour
1b890 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77  nal, nRec==0 alw
1b8a0 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ays means that t
1b8b0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63  he next.    ** c
1b8c0 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  hunk of the jour
1b8d0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  nal contains zer
1b8e0 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f  o pages to be ro
1b8f0 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a  lled back.  But.
1b900 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e      ** when doin
1b910 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  g a ROLLBACK and
1b920 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75   the nRec==0 chu
1b930 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  nk is the last c
1b940 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74  hunk in.    ** t
1b950 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d  he journal, it m
1b960 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f  eans that the jo
1b970 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
1b980 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20  ain additional. 
1b990 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74     ** pages that
1b9a0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c   need to be roll
1b9b0 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ed back and that
1b9c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1b9d0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f  ages .    ** sho
1b9e0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
1b9f0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  based on the jou
1ba00 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a  rnal file size..
1ba10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1ba20 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
1ba30 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
1ba40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
1ba50 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1ba60 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
1ba70 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
1ba80 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1ba90 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
1baa0 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
1bab0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1bac0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1bad0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1bae0 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
1baf0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
1bb00 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
1bb10 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
1bb20 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
1bb30 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
1bb40 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1bb50 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1bb60 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1bb70 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
1bb80 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1bb90 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
1bba0 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
1bbb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1bbd0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1bbe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1bbf0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
1bc00 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  Pg;.    }..    /
1bc10 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
1bc20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
1bc30 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
1bc40 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  k into the .    
1bc50 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1bc60 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63   and/or page cac
1bc70 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  he..    */.    f
1bc80 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
1bc90 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  u++){.      if( 
1bca0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29  needPagerReset )
1bcb0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
1bcc0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1bcd0 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72         needPager
1bce0 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  Reset = 0;.     
1bcf0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61   }.      rc = pa
1bd00 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1bd10 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50  _page(pPager,&pP
1bd20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1bd30 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69  ,0,1,0);.      i
1bd40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bd50 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1bd60 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1bd70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
1bd80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1bd90 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
1bda0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1bdb0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1bdc0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1bdd0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
1bde0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
1bdf0 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72  rnal has been tr
1be00 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20  uncated, simply 
1be10 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64  stop reading and
1be20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1be30 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75  ocessing the jou
1be40 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74  rnal. This might
1be50 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a   happen if the j
1be60 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20  ournal was.     
1be70 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70       ** not comp
1be80 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61  letely written a
1be90 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20  nd synced prior 
1bea0 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20  to a crash.  In 
1beb0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
1bec0 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61  * case, the data
1bed0 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65  base should have
1bee0 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
1bef0 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ten in the.     
1bf00 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c       ** first pl
1bf10 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20  ace so it is OK 
1bf20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f  to simply abando
1bf30 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  n the rollback. 
1bf40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
1bf50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1bf60 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1bf70 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1bf80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bf90 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1bfa0 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  unable to rollba
1bfb0 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74  ck, quit and ret
1bfc0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20  urn the error.  
1bfd0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e          ** code.
1bfe0 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
1bff0 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  e the pager to e
1c000 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
1c010 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a  tate.          *
1c020 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72  * so that no fur
1c030 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62  ther harm will b
1c040 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73  e done.  Perhaps
1c050 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20   the next.      
1c060 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74      ** process t
1c070 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c  o come along wil
1c080 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c  l be able to rol
1c090 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61  lback the databa
1c0a0 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
1c0b0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1c0c0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c0e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
1c0f0 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
1c100 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
1c110 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f  layback:.  /* Fo
1c120 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61  llowing a rollba
1c130 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
1c140 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1c150 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67  back in its orig
1c160 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20  inal.  ** state 
1c170 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
1c180 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
1c190 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65  ction, so invoke
1c1a0 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
1c1b0 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1c1c0 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GED file-control
1c1d0 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62   method to disab
1c1e0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65  le the.  ** asse
1c1f0 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74  rtion that the t
1c200 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1c210 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e  er was modified.
1c220 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1c230 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1c240 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1c250 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  hods ){.    sqli
1c260 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1c270 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
1c280 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1c290 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20  UNCHANGED,0);.  
1c2a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1c2b0 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20  f this playback 
1c2c0 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74  is happening aut
1c2d0 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20  omatically as a 
1c2e0 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20  result of an IO 
1c2f0 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  or .  ** malloc 
1c300 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
1c310 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
1c320 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
1c330 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
1c340 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
1c350 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
1c360 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
1c370 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1c380 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
1c390 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
1c3a0 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
1c3b0 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
1c3c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
1c3d0 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
1c3e0 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
1c3f0 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
1c400 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
1c410 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
1c420 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
1c430 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
1c440 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
1c450 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
1c460 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
1c470 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
1c480 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
1c490 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
1c4a0 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
1c4b0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
1c4c0 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
1c4d0 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
1c4e0 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
1c4f0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
1c500 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1c510 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
1c520 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
1c530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c540 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
1c550 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1c560 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
1c570 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1c580 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1c590 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1c5a0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1c5b0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1c5c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1c5d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c5e0 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67  E_OK.   && (pPag
1c5f0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1c600 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
1c610 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1c620 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20  ==PAGER_OPEN).  
1c630 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1c640 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61  te3PagerSync(pPa
1c650 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
1c660 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c670 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1c680 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
1c690 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b  pPager, zMaster[
1c6a0 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20  0]!='\0', 0);.  
1c6b0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1c6c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1c6d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c6e0 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1c6f0 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  0] && res ){.   
1c700 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
1c710 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1c720 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
1c730 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
1c740 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
1c750 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
1c760 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
1c770 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1c780 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  l..    */.    rc
1c790 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
1c7a0 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  er(pPager, zMast
1c7b0 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  er);.    testcas
1c7c0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1c7d0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   );.  }..  /* Th
1c7e0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1c7f0 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
1c800 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
1c810 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
1c820 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
1c830 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
1c840 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
1c850 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
1c860 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
1c870 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
1c880 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1c890 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
1c8a0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
1c8b0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1c8c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c8d0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1c8e0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
1c8f0 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1c900 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1c910 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
1c920 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1c930 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1c940 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1c950 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1c960 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1c970 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1c980 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1c990 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1c9a0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1c9b0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1c9c0 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1c9d0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1c9e0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1c9f0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1ca00 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1ca10 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1ca20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1ca30 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1ca40 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1ca50 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1ca60 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1ca70 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1ca80 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1ca90 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1caa0 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1cab0 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1cac0 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1cad0 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
1cae0 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
1caf0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
1cb00 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
1cb10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cb20 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1cb30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1cb40 0a 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d  .  int isInWal =
1cb50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1cb60 2f 2a 20 54 72 75 65 20 69 66 20 70 61 67 65 20  /* True if page 
1cb70 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a  is in log file *
1cb80 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  /.  int pgsz = p
1cb90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1cba0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1cbb0 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a  tes to read */..
1cbc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1cbd0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1cbe0 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42  READER && !MEMDB
1cbf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
1cc00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1cc10 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
1cc20 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  (!isOpen(pPager-
1cc30 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73  >fd)) ){.    ass
1cc40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
1cc50 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d  pFile );.    mem
1cc60 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
1cc70 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
1cc80 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ize);.    return
1cc90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1cca0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
1ccb0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
1ccc0 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c    /* Try to pull
1ccd0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1cce0 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  he write-ahead l
1ccf0 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
1cd00 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70  sqlite3WalRead(p
1cd10 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
1cd20 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73  o, &isInWal, pgs
1cd30 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  z, pPg->pData);.
1cd40 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1cd50 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e  LITE_OK && !isIn
1cd60 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69  Wal ){.    i64 i
1cd70 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
1cd80 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1cd90 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
1cda0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1cdb0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
1cdc0 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f  >pData, pgsz, iO
1cdd0 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ffset);.    if( 
1cde0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1cdf0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1ce00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ce10 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
1ce20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1ce30 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1ce40 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
1ce50 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73  ead is unsuccess
1ce60 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46  ful, set the dbF
1ce70 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d  ileVers[] to som
1ce80 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ething.      ** 
1ce90 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
1cea0 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20  be a valid file 
1ceb0 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65  version.  dbFile
1cec0 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79  Vers[] is a copy
1ced0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74  .      ** of byt
1cee0 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  es 24..39 of the
1cef0 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65   database.  Byte
1cf00 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20  s 28..31 should 
1cf10 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20  always be.      
1cf20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73  ** zero or the s
1cf30 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1cf40 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74  ase in page. Byt
1cf50 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35  es 32..35 and 35
1cf60 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68  ..39.      ** sh
1cf70 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
1cf80 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e  bers which are n
1cf90 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e  ever 0xffffffff.
1cfa0 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20    So filling.   
1cfb0 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62     ** pPager->db
1cfc0 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
1cfd0 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73  all 0xff bytes s
1cfe0 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20  hould suffice.. 
1cff0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1d000 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65   For an encrypte
1d010 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  d database, the 
1d020 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72  situation is mor
1d030 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65  e complex:  byte
1d040 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33  s.      ** 24..3
1d050 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1d060 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73  e are white nois
1d070 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62  e.  But the prob
1d080 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20  ability of.     
1d090 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e   ** white noisin
1d0a0 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79  g equaling 16 by
1d0b0 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76  tes of 0xff is v
1d0c0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
1d0d0 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20   so.      ** we 
1d0e0 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20  should still be 
1d0f0 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ok..      */.   
1d100 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72     memset(pPager
1d110 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78  ->dbFileVers, 0x
1d120 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  ff, sizeof(pPage
1d130 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1d140 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d150 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73    u8 *dbFileVers
1d160 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70   = &((u8*)pPg->p
1d170 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20  Data)[24];.     
1d180 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1d190 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
1d1a0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1d1b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d1c0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rs));.    }.  }.
1d1d0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
1d1e0 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e   pPg->pData, pgn
1d1f0 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54  o, 3, rc = SQLIT
1d200 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47  E_NOMEM);..  PAG
1d210 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1d220 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
1d230 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
1d240 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
1d250 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
1d260 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
1d270 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50  ger, pgno));.  P
1d280 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43  AGERTRACE(("FETC
1d290 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  H %d page %d has
1d2a0 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1d2b0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1d2c0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
1d2d0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1d2e0 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75  (pPg)));..  retu
1d2f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d300 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65  Update the value
1d310 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63   of the change-c
1d320 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74  ounter at offset
1d330 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a  s 24 and 92 in.*
1d340 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  * the header and
1d350 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72 73   the sqlite vers
1d360 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66  ion number at of
1d370 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54  fset 96..**.** T
1d380 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64  his is an uncond
1d390 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20  itional update. 
1d3a0 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61   See also the pa
1d3b0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1d3c0 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74  ounter().** rout
1d3d0 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75  ine which only u
1d3e0 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1d3f0 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65  e-counter if the
1d400 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75 61   update is actua
1d410 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61  lly.** needed, a
1d420 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1d430 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  the pPager->chan
1d440 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74  geCountDone stat
1d450 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
1d460 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
1d470 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1d480 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67 29  nter(PgHdr *pPg)
1d490 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  {.  u32 change_c
1d4a0 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e  ounter;..  /* In
1d4b0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1d4c0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1d4d0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1d4e0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63   byte 24. */.  c
1d4f0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
1d500 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
1d510 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72  (u8*)pPg->pPager
1d520 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b  ->dbFileVers)+1;
1d530 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1d540 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1d550 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
1d560 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ter);..  /* Also
1d570 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74   store the SQLit
1d580 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1d590 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39   in bytes 96..99
1d5a0 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74   and in.  ** byt
1d5b0 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20  es 92..95 store 
1d5c0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1d5d0 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
1d5e0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a   version number.
1d5f0 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a    ** is valid. *
1d600 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  /.  put32bits(((
1d610 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1d620 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+92, change_cou
1d630 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69  nter);.  put32bi
1d640 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1d650 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54  pData)+96, SQLIT
1d660 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
1d670 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
1d680 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1d690 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1d6a0 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  n is invoked onc
1d6b0 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  e for each page 
1d6c0 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1d6d0 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65   been .** writte
1d6e0 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66  n into the log f
1d6f0 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74  ile when a WAL t
1d700 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1d710 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61  lled back..** Pa
1d720 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74  rameter iPg is t
1d730 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1d740 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65  f said page. The
1d750 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a   pCtx argument .
1d760 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  ** is actually a
1d770 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1d780 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
1d790 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69  .**.** If page i
1d7a0 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  Pg is present in
1d7b0 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20   the cache, and 
1d7c0 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1d7d0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a  ng references,.*
1d7e0 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65  * it is discarde
1d7f0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1d800 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   there are one o
1d810 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69  r more outstandi
1d820 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ng.** references
1d830 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1d840 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66  nt is reloaded f
1d850 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d860 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65  . If the.** atte
1d870 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f  mpt to reload co
1d880 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1d890 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69  atabase is requi
1d8a0 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a  red and fails, .
1d8b0 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
1d8c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1d8d0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1d8e0 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
1d8f0 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  int pagerUndoCal
1d900 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78  lback(void *pCtx
1d910 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69  , Pgno iPg){.  i
1d920 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d930 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1d940 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43  er = (Pager *)pC
1d950 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  tx;.  PgHdr *pPg
1d960 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74  ;..  pPg = sqlit
1d970 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
1d980 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66  ager, iPg);.  if
1d990 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28  ( pPg ){.    if(
1d9a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
1d9b0 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d  geRefcount(pPg)=
1d9c0 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
1d9d0 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
1d9e0 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
1d9f0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
1da00 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
1da10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1da20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
1da30 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
1da40 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
1da50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1da60 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1da70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  }.  }..  /* Norm
1da80 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73  ally, if a trans
1da90 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1daa0 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75   back, any backu
1dab0 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a  p processes are.
1dac0 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20    ** updated as 
1dad0 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f  data is copied o
1dae0 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  ut of the rollba
1daf0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ck journal and i
1db00 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
1db10 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e  abase. This is n
1db20 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73  ot generally pos
1db30 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c  sible with a WAL
1db40 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20   database, as.  
1db50 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f  ** rollback invo
1db60 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e  lves simply trun
1db70 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66  cating the log f
1db80 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20  ile. Therefore, 
1db90 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d  if one.  ** or m
1dba0 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20  ore frames have 
1dbb0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1dbc0 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20  tten to the log 
1dbd0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a  (and therefore .
1dbe0 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64    ** also copied
1dbf0 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70   into the backup
1dc00 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70   databases) as p
1dc10 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  art of this tran
1dc20 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68  saction,.  ** th
1dc30 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62  e backups must b
1dc40 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a  e restarted..  *
1dc50 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  /.  sqlite3Backu
1dc60 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
1dc70 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65  >pBackup);..  re
1dc80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1dc90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1dca0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c  is called to rol
1dcb0 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1dcc0 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74  ion on a WAL dat
1dcd0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1dce0 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61   int pagerRollba
1dcf0 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  ckWal(Pager *pPa
1dd00 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1dd30 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64  n Code */.  PgHd
1dd40 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  r *pList;       
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1dd60 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1dd70 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a  es to revert */.
1dd80 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61  .  /* For all pa
1dd90 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
1dda0 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
1ddb0 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76  tly dirty or hav
1ddc0 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62  e already.  ** b
1ddd0 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74  een written (but
1dde0 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20   not committed) 
1ddf0 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c  to the log file,
1de00 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a   do one of the .
1de10 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a    ** following:.
1de20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69    **.  **   + Di
1de30 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64  scard the cached
1de40 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75   page (if refcou
1de50 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  nt==0), or.  ** 
1de60 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20    + Reload page 
1de70 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1de80 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65   database (if re
1de90 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a  fcount>0)..  */.
1dea0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1deb0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
1dec0 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  gSize;.  rc = sq
1ded0 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61  lite3WalUndo(pPa
1dee0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72  ger->pWal, pager
1def0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76  UndoCallback, (v
1df00 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20  oid *)pPager);. 
1df10 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1df20 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1df30 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1df40 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
1df50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1df60 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  K ){.    PgHdr *
1df70 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pNext = pList->p
1df80 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20  Dirty;.    rc = 
1df90 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1dfa0 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  k((void *)pPager
1dfb0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
1dfc0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
1dfd0 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
1dfe0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1dff0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1e000 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
1e010 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1e020 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c  (). As well as l
1e030 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  ogging.** the co
1e040 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69  ntents of the li
1e050 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64  st of pages head
1e060 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e  ed by pList (con
1e070 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
1e080 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1e090 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79  ion notifies any
1e0a0 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70   active backup p
1e0b0 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68  rocesses that th
1e0c0 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20  e pages have.** 
1e0d0 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  changed. .**.** 
1e0e0 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  The list of page
1e0f0 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  s passed into th
1e100 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c  is routine is al
1e110 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20 70  ways sorted by p
1e120 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48  age number..** H
1e130 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31 20  ence, if page 1 
1e140 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72 65  appears anywhere
1e150 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74   on the list, it
1e160 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72   will be the fir
1e170 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61  st page..*/ .sta
1e180 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c  tic int pagerWal
1e190 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20  Frames(.  Pager 
1e1a0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
1e1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1e1c0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
1e1d0 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20  gHdr *pList,    
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e1f0 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73  * List of frames
1e200 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e   to log */.  Pgn
1e210 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  o nTruncate,    
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e230 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66  Database size af
1e240 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20  ter this commit 
1e250 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
1e260 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1e270 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e280 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74  this is a commit
1e290 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e2c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1e2d0 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20   nList;         
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e2f0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e300 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 23 69 66 20  in pList */.#if 
1e310 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1e320 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1e330 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41  (SQLITE_CHECK_PA
1e340 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a 70 3b  GES).  PgHdr *p;
1e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e360 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1e370 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73  oping over pages
1e380 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
1e390 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
1e3a0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
1e3b0 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20  pList );.#ifdef 
1e3c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1e3d0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1e3e0 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69  e page list is i
1e3f0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
1e400 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69  r */.  for(p=pLi
1e410 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72  st; p && p->pDir
1e420 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  ty; p=p->pDirty)
1e430 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
1e440 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74  >pgno < p->pDirt
1e450 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23  y->pgno );.  }.#
1e460 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1e470 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d   pList->pDirty==
1e480 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b  0 || isCommit );
1e490 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20  .  if( isCommit 
1e4a0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57  ){.    /* If a W
1e4b0 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1e4c0 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  s being committe
1e4d0 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  d, there is no p
1e4e0 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a  oint in writing.
1e4f0 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73      ** any pages
1e500 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
1e510 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  rs greater than 
1e520 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74  nTruncate into t
1e530 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20  he WAL file..   
1e540 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65   ** They will ne
1e550 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20 61  ver be read by a
1e560 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65  ny client. So re
1e570 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
1e580 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a  he pDirty.    **
1e590 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20   list here. */. 
1e5a0 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
1e5b0 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1e5c0 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1e5d0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1e5e0 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1e5f0 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1e600 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1e610 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1e620 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1e630 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1e640 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1e650 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1e660 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1e670 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1e680 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1e690 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1e6a0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1e6b0 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1e6c0 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1e6d0 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1e6e0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1e6f0 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1e700 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1e710 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1e720 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1e730 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1e740 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1e750 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1e760 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1e770 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e780 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1e790 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1e7a0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
1e7b0 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1e7c0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1e7d0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1e7e0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1e7f0 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
1e800 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
1e810 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1e820 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1e830 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20  PAGES.  pList = 
1e840 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1e850 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1e860 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70  PCache);.  for(p
1e870 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1e880 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67  pDirty){.    pag
1e890 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
1e8a0 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
1e8b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e8c0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65  /*.** Begin a re
1e8d0 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad transaction o
1e8e0 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a  n the WAL..**.**
1e8f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
1e900 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
1e910 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68  "pagerOpenSnapsh
1e920 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74  ot()" because it
1e930 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20   essentially.** 
1e940 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74  makes a snapshot
1e950 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e960 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
1e970 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e  point in time an
1e980 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74  d preserves.** t
1e990 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72  hat snapshot for
1e9a0 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64   use by the read
1e9b0 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63  er in spite of c
1e9c0 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e  oncurrently chan
1e9d0 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20  ges by.** other 
1e9e0 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b  writers or check
1e9f0 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
1ea00 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67  tic int pagerBeg
1ea10 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1ea20 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
1ea30 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1ea60 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e  de */.  int chan
1ea70 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ged = 0;        
1ea80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ea90 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  if cache must be
1eaa0 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73   reset */..  ass
1eab0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1eac0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
1ead0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1eae0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1eaf0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1eb00 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
1eb10 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65   );..  /* sqlite
1eb20 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
1eb30 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74  action() was not
1eb40 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
1eb50 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72  previous.  ** tr
1eb60 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63  ansaction in loc
1eb70 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
1eb80 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74  IVE.  So call it
1eb90 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a   now.  If we.  *
1eba0 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67  * are in locking
1ebb0 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64  _mode=NORMAL and
1ebc0 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70   EndRead() was p
1ebd0 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
1ebe0 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69  ,.  ** the dupli
1ebf0 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72  cate call is har
1ec00 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  mless..  */.  sq
1ec10 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1ec20 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1ec30 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20  r->pWal);..  rc 
1ec40 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
1ec50 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1ec60 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
1ec70 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20  changed);.  if( 
1ec80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1ec90 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20   changed ){.    
1eca0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1ecb0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  er);.  }..  retu
1ecc0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1ecd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1ece0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
1ecf0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72  s part of the tr
1ed00 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41  ansition from PA
1ed10 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50  GER_OPEN.** to P
1ed20 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
1ed30 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
1ed40 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1ed50 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1ed60 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69  in pages (assumi
1ed70 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ng the page size
1ed80 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1ed90 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53  d in Pager.pageS
1eda0 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ize)..**.** If n
1edb0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1edc0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1edd0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69  urned and the si
1ede0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1edf0 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69  se.** in pages i
1ee00 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50  s stored in *pnP
1ee10 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
1ee20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70  an error code (p
1ee30 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45  erhaps.** SQLITE
1ee40 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73  _IOERR_FSTAT) is
1ee50 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1ee60 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
1ee70 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
1ee80 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
1ee90 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
1eea0 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61  ager, Pgno *pnPa
1eeb0 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1eec0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1eed0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1eee0 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
1eef0 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51  nPage */..  /* Q
1ef00 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62  uery the WAL sub
1ef10 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
1ef20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54  database size. T
1ef30 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20  he WalDbsize(). 
1ef40 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74   ** function ret
1ef50 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65  urns zero if the
1ef60 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e   WAL is not open
1ef70 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61   (i.e. Pager.pWa
1ef80 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69  l==0), or.  ** i
1ef90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1efa0 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ize is not avail
1efb0 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61  able. The databa
1efc0 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20  se size is not. 
1efd0 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72   ** available fr
1efe0 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1eff0 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67  ystem if the log
1f000 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f   file is empty o
1f010 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  r.  ** contains 
1f020 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74  no valid committ
1f030 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
1f040 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f050 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1f060 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
1f070 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f080 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
1f090 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20  CK );.  nPage = 
1f0a0 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
1f0b0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1f0c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
1f0d0 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e  abase size was n
1f0e0 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ot available fro
1f0f0 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  m the WAL sub-sy
1f100 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72  stem,.  ** deter
1f110 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e  mine it based on
1f120 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1f140 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a  If the size.  **
1f150 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f160 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20   file is not an 
1f170 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
1f180 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
1f190 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f  e,.  ** round do
1f1a0 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73  wn to the neares
1f1b0 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20  t page. Except, 
1f1c0 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20  any file larger 
1f1d0 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65  than 0.  ** byte
1f1e0 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
1f1f0 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61  sidered to conta
1f200 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  in at least one 
1f210 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1f220 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1f230 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f250 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * Size of db fil
1f260 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1f270 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1f280 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1f290 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1f2a0 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
1f2b0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1f2c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
1f2d0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1f2e0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
1f2f0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
1f300 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f310 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f330 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1f340 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61  o)((n+pPager->pa
1f350 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67  geSize-1) / pPag
1f360 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1f370 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1f380 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
1f390 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1f3a0 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ile is greater t
1f3b0 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  han the.  ** con
1f3c0 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
1f3d0 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
1f3e0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
1f3f0 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
1f400 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
1f410 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
1f420 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
1f430 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1f440 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
1f450 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
1f460 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20  .  }..  *pnPage 
1f470 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1f480 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f490 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f4a0 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68  MIT_WAL./*.** Ch
1f4b0 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c  eck if the *-wal
1f4c0 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65   file that corre
1f4d0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61  sponds to the da
1f4e0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1f4f0 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74   pPager.** exist
1f500 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  s if the databas
1f510 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f  e is not empy, o
1f520 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  r verify that th
1f530 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
1f540 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28  s.** not exist (
1f550 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20  by deleting it) 
1f560 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1f570 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  file is empty..*
1f580 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1f590 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74  base is not empt
1f5a0 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20  y and the *-wal 
1f5b0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65  file exists, ope
1f5c0 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69  n the pager.** i
1f5d0 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20  n WAL mode.  If 
1f5e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1f5f0 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a  empty or if no *
1f600 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
1f610 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72   and.** if no er
1f620 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  ror occurs, make
1f630 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
1f640 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
1f650 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a  et to.** PAGER_J
1f660 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a  OURNALMODE_WAL..
1f670 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1f680 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72  ITE_OK or an err
1f690 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
1f6a0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68  he caller must h
1f6b0 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63  old a SHARED loc
1f6c0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1f6d0 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e file to call t
1f6e0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
1f6f0 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c   Because an EXCL
1f700 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1f710 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71  e db file is req
1f720 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20  uired to delete 
1f730 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e  .** a WAL on a n
1f740 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61  one-empty databa
1f750 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  se, this ensures
1f760 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
1f770 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  e condition .** 
1f780 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63  between the xAcc
1f790 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20  ess() below and 
1f7a0 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
1f7b0 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
1f7c0 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f  ome .** other co
1f7d0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1f7e0 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1f7f0 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61  nWalIfPresent(Pa
1f800 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1f810 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f820 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
1f830 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1f840 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1f850 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1f860 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1f870 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
1f880 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1f890 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20      int isWal;  
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c    /* True if WAL
1f8c0 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
1f8d0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1f900 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1f910 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  /..    rc = page
1f920 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1f930 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1f940 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f950 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67  rc;.    if( nPag
1f960 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
1f970 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
1f980 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
1f990 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30   pPager->zWal, 0
1f9a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1f9b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  =SQLITE_IOERR_DE
1f9c0 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20  LETE_NOENT ) rc 
1f9d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1f9e0 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20     isWal = 0;.  
1f9f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1fa00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1fa10 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70  ess(.          p
1fa20 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
1fa30 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54  ger->zWal, SQLIT
1fa40 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1fa50 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b   &isWal.      );
1fa60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1fa70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fa80 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20        if( isWal 
1fa90 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
1faa0 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63  ase( sqlite3Pcac
1fab0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
1fac0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
1fad0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1fae0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1faf0 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  Wal(pPager, 0);.
1fb00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1fb10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1fb20 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
1fb30 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20  ALMODE_WAL ){.  
1fb40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1fb50 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
1fb60 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
1fb70 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LETE;.      }.  
1fb80 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1fb90 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
1fba0 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61  *.** Playback sa
1fbb0 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69  vepoint pSavepoi
1fbc0 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65  nt. Or, if pSave
1fbd0 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65  point==NULL, the
1fbe0 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68  n playback.** th
1fbf0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
1fc00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
1fc10 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e  e case pSavepoin
1fc20 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77  t==NULL occurs w
1fc30 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41  hen .** a ROLLBA
1fc40 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73  CK TO command is
1fc50 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41   invoked on a SA
1fc60 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20  VEPOINT that is 
1fc70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
1fc80 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a  * savepoint..**.
1fc90 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69  ** When pSavepoi
1fca0 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28  nt is not NULL (
1fcb0 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72  meaning a non-tr
1fcc0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
1fcd0 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67  int is .** being
1fce0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74   rolled back), t
1fcf0 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
1fd00 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20   consists of up 
1fd10 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c  to three stages,
1fd20 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e  .** performed in
1fd30 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69   the order speci
1fd40 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  fied:.**.**   * 
1fd50 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  Pages are played
1fd60 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
1fd70 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
1fd80 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20  ting at byte.** 
1fd90 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72      offset Pager
1fda0 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
1fdb0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
1fdc0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65   to .**     Page
1fdd0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
1fde0 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65  ffset, or to the
1fdf0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
1fe00 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
1fe10 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76  file if PagerSav
1fe20 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
1fe30 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  t is zero..**.**
1fe40 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76     * If PagerSav
1fe50 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
1fe60 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
1fe70 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c  hen pages are pl
1fe80 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b  ayed.**     back
1fe90 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74   starting from t
1fea0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1feb0 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  r immediately fo
1fec0 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20  llowing .**     
1fed0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1fee0 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65  HdrOffset to the
1fef0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
1ff00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
1ff10 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
1ff20 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62  re then played b
1ff30 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ack from the sub
1ff40 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73  -journal file, s
1ff50 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77  tarting.**     w
1ff60 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76  ith the PagerSav
1ff70 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61  epoint.iSubRec a
1ff80 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
1ff90 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20   the end of.**  
1ffa0 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
1ffb0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75  ile..**.** Throu
1ffc0 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61  ghout the rollba
1ffd0 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68  ck process, each
1ffe0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
1fff0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
20000 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
20010 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
20020 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  a bitvec structu
20030 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f  re (variable pDo
20040 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70  ne in the.** imp
20050 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f  lementation belo
20060 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  w). This is used
20070 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
20080 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a  a page is only.*
20090 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  * rolled back th
200a0 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20  e first time it 
200b0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
200c0 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c  n either journal
200d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65  ..**.** If pSave
200e0 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  point is NULL, t
200f0 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e  hen pages are on
20100 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  ly played back f
20110 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  rom the main.** 
20120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
20130 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
20140 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74  or a bitvec in t
20150 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
20160 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
20170 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20  before playback 
20180 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61  commences the Pa
20190 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61  ger.dbSize varia
201a0 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20  ble.** is reset 
201b0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  to the value tha
201c0 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65  t it held at the
201d0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61   start of the sa
201e0 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20  vepoint .** (or 
201f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f  transaction). No
20200 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67   page with a pag
20210 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e-number greater
20220 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
20230 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61  .** is played ba
20240 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e  ck. If one is en
20250 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
20260 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a  simply skipped..
20270 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20280 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
20290 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
202a0 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69  er, PagerSavepoi
202b0 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b  nt *pSavepoint){
202c0 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
202d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
202e0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
202f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20300 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  l */.  i64 iHdrO
20310 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
20320 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20  /* End of first 
20330 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d  segment of main-
20340 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
20350 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
20360 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
20370 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
20380 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20    Bitvec *pDone 
20390 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69  = 0;       /* Bi
203a0 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70  tvec to ensure p
203b0 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b  ages played back
203c0 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20   only once */.. 
203d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
203e0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
203f0 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
20400 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20410 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
20420 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41  OCKED );..  /* A
20430 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
20440 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
20450 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
20460 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
20470 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20480 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
20490 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
204a0 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
204b0 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
204c0 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
204d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
204e0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
204f0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61  .  /* Set the da
20500 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b  tabase size back
20510 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
20520 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20   was before the 
20530 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
20540 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77  being reverted w
20550 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  as opened..  */.
20560 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20570 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20   = pSavepoint ? 
20580 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
20590 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  g : pPager->dbOr
205a0 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  igSize;.  pPager
205b0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
205c0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
205d0 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53  File;..  if( !pS
205e0 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65  avepoint && page
205f0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20600 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
20610 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70  gerRollbackWal(p
20620 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
20630 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f  * Use pPager->jo
20640 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20  urnalOff as the 
20650 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  effective size o
20660 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  f the main rollb
20670 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
20680 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69  .  The actual fi
20690 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  le might be larg
206a0 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a  er than this in.
206b0 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e    ** PAGER_JOURN
206c0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
206d0 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  or PAGER_JOURNAL
206e0 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42  MODE_PERSIST.  B
206f0 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a  ut anything.  **
20700 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f   past pPager->jo
20710 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d  urnalOff is off-
20720 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20  limits to us..  
20730 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  */.  szJ = pPage
20740 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
20750 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
20760 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
20770 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20  || szJ==0 );..  
20780 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c  /* Begin by roll
20790 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
207a0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
207b0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
207c0 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  at.  ** PagerSav
207d0 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
207e0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
207f0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
20800 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54  l header..  ** T
20810 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65  here might be re
20820 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69  cords in the mai
20830 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68  n journal that h
20840 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ave a page numbe
20850 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74  r.  ** greater t
20860 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
20870 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70  database size (p
20880 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62  Pager->dbSize) b
20890 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69  ut those.  ** wi
208a0 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75  ll be skipped au
208b0 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61  tomatically.  Pa
208c0 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  ges are added to
208d0 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20   pDone as they. 
208e0 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62   ** are played b
208f0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ack..  */.  if( 
20900 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  pSavepoint && !p
20910 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
20920 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66  r) ){.    iHdrOf
20930 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
20940 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61  iHdrOffset ? pSa
20950 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
20960 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70  set : szJ;.    p
20970 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20980 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
20990 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69  iOffset;.    whi
209a0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
209b0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
209c0 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20  rnalOff<iHdrOff 
209d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
209e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
209f0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
20a00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20a10 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
20a20 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
20a30 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
20a40 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NE );.  }else{. 
20a50 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
20a60 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
20a70 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
20a80 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
20a90 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
20aa0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
20ab0 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
20ac0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
20ad0 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
20ae0 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
20af0 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
20b00 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
20b10 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
20b20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
20b30 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
20b40 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
20b50 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
20b60 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
20b70 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
20b80 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
20b90 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
20ba0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
20bb0 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
20bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
20bd0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
20be0 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20   u32 nJRec = 0; 
20bf0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20c00 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
20c10 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
20c20 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
20c30 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
20c40 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  r, 0, szJ, &nJRe
20c50 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
20c60 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20c70 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20  TE_DONE );..    
20c80 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70  /*.    ** The "p
20c90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
20ca0 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
20cb0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
20cc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20  ->journalOff".  
20cd0 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c    ** test is rel
20ce0 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23  ated to ticket #
20cf0 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64  2565.  See the d
20d00 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65  iscussion in the
20d10 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  .    ** pager_pl
20d20 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f  ayback() functio
20d30 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  n for additional
20d40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
20d50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52    */.    if( nJR
20d60 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  ec==0 .     && p
20d70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
20d80 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
20d90 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
20da0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20  ->journalOff.   
20db0 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
20dc0 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70  = (u32)((szJ - p
20dd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20de0 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  f)/JOURNAL_PG_SZ
20df0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
20e00 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72  .    for(ii=0; r
20e10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20e20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67  ii<nJRec && pPag
20e30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
20e40 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  zJ; ii++){.     
20e50 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20e60 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
20e70 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
20e80 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
20e90 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
20ea0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
20eb0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
20ec0 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
20ed0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
20ee0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
20ef0 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  =szJ );..  /* Fi
20f00 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b  nally,  rollback
20f10 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
20f20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61  sub-journal.  Pa
20f30 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a  ge that were.  *
20f40 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c  * previously rol
20f50 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20  led back out of 
20f60 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20f70 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20   (and are hence 
20f80 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77  in pDone).  ** w
20f90 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ill be skipped. 
20fa0 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   Out-of-range pa
20fb0 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69  ges are also ski
20fc0 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  pped..  */.  if(
20fd0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
20fe0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
20ff0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21000 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34  unter */.    i64
21010 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70   offset = (i64)p
21020 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
21030 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
21040 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  geSize);..    if
21050 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
21060 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
21070 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61  c = sqlite3WalSa
21080 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67  vepointUndo(pPag
21090 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70  er->pWal, pSavep
210a0 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b  oint->aWalData);
210b0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
210c0 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
210d0 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
210e0 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
210f0 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
21100 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21110 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69   offset==(i64)ii
21120 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
21130 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72  Size) );.      r
21140 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
21150 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
21160 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f  er, &offset, pDo
21170 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 0, 1);.    }
21180 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21190 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
211a0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
211b0 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
211c0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
211d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
211e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
211f0 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20  f = szJ;.  }..  
21200 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21210 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
21220 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
21230 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
21240 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
21250 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
21260 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
21270 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
21280 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
21290 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
212a0 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
212b0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
212c0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  age);.}../*.** F
212d0 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
212e0 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
212f0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  rom the pager..*
21300 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
21310 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20  gerShrink(Pager 
21320 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
21330 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28  te3PcacheShrink(
21340 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
21350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
21360 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
21370 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21380 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
21390 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
213a0 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
213b0 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
213c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
213d0 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
213e0 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
213f0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
21400 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
21410 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
21420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21430 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
21440 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
21450 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
21470 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
21480 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
21490 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
214a0 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
214b0 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
214c0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
214d0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
214e0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
214f0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
21500 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
21510 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
21530 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
21540 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
21550 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
21560 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
21570 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
21580 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
21590 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
215a0 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
215b0 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
215c0 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
215d0 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
215e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
215f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
21600 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
21610 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
21620 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
21630 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
21640 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
21650 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
21660 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21670 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
21680 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
21690 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
216a0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
216c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
216d0 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
216e0 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
216f0 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
21700 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
21710 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
21720 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
21730 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
21740 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
21750 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
21760 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
21770 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21780 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
21790 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
217a0 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
217b0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
217c0 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
217d0 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
217e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
217f0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
21800 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  ..**.** The abov
21810 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62  e is for a rollb
21820 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ack-journal mode
21830 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c  .  For WAL mode,
21840 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a   OFF continues.*
21850 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e  * to mean that n
21860 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63  o syncs ever occ
21870 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e  ur.  NORMAL mean
21880 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69  s that the WAL i
21890 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f  s synced.** prio
218a0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
218b0 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64  f checkpoint and
218c0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
218d0 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  se file is synce
218e0 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  d.** at the conc
218f0 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  lusion of the ch
21900 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
21910 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
21920 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73  f the WAL.** was
21930 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
21940 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
21950 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70    But no sync op
21960 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66  erations occur f
21970 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  or.** an ordinar
21980 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d  y commit in NORM
21990 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c  AL mode with WAL
219a0 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68  .  FULL means th
219b0 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69  at the WAL.** fi
219c0 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c  le is synced fol
219d0 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d  lowing each comm
219e0 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e  it operation, in
219f0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
21a00 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69  .** syncs associ
21a10 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c  ated with NORMAL
21a20 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63  ..**.** Do not c
21a30 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f  onfuse synchrono
21a40 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c  us=FULL with SQL
21a50 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20  ITE_SYNC_FULL.  
21a60 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59  The.** SQLITE_SY
21a70 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65  NC_FULL macro me
21a80 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d  ans to use the M
21a90 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c  acOSX-style full
21aa0 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20  -fsync.** using 
21ab0 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e  fcntl(F_FULLFSYN
21ac0 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43  C).  SQLITE_SYNC
21ad0 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f  _NORMAL means to
21ae0 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61   do an.** ordina
21af0 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ry fsync() call.
21b00 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
21b10 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
21b20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
21b30 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  L.** and SQLITE_
21b40 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70  SYNC_NORMAL on p
21b50 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74  latforms other t
21b60 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74  han MacOSX.  But
21b70 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e   the.** synchron
21b80 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20  ous=FULL versus 
21b90 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
21ba0 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72  AL setting deter
21bb0 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68  mines when.** th
21bc0 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76  e xSync primitiv
21bd0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20  e is called and 
21be0 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61  is relevant to a
21bf0 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a  ll platforms..**
21c00 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
21c10 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
21c20 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
21c30 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
21c40 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
21c50 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
21c60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
21c70 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
21c80 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
21c90 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67  fetyLevel(.  Pag
21ca0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
21cb0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
21cc0 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65  to set safety le
21cd0 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  vel for */.  int
21ce0 20 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20   level,         
21cf0 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e     /* PRAGMA syn
21d00 63 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46  chronous.  1=OFF
21d10 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55  , 2=NORMAL, 3=FU
21d20 4c 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46  LL */  .  int bF
21d30 75 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20  ullFsync,       
21d40 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73  /* PRAGMA fullfs
21d50 79 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b  ync */.  int bCk
21d60 70 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f  ptFullFsync    /
21d70 2a 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f  * PRAGMA checkpo
21d80 69 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f  int_fullfsync */
21d90 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65  .){.  assert( le
21da0 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c  vel>=1 && level<
21db0 3d 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =3 );.  pPager->
21dc0 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c  noSync =  (level
21dd0 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
21de0 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
21df0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
21e00 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26  c = (level==3 &&
21e10 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
21e20 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20  le) ?1:0;.  if( 
21e30 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
21e40 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
21e50 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ncFlags = 0;.   
21e60 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
21e70 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65  cFlags = 0;.  }e
21e80 6c 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79  lse if( bFullFsy
21e90 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
21ea0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
21eb0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
21ec0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
21ed0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
21ee0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
21ef0 7d 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46  }else if( bCkptF
21f00 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20  ullFsync ){.    
21f10 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
21f20 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
21f30 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
21f40 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
21f50 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
21f60 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  FULL;.  }else{. 
21f70 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
21f80 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
21f90 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
21fa0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
21fb0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
21fc0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  NC_NORMAL;.  }. 
21fd0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
21fe0 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e  Flags = pPager->
21ff0 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28  syncFlags;.  if(
22000 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
22010 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
22020 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d  >walSyncFlags |=
22030 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41   WAL_SYNC_TRANSA
22040 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65  CTIONS;.  }.}.#e
22050 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
22060 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
22070 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
22080 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
22090 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
220a0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
220b0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
220c0 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
220d0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
220e0 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
220f0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
22100 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
22110 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
22120 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
22130 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
22140 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
22150 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a  porary file..**.
22160 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
22170 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
22180 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e  o *pFile. Return
22190 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
221a0 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d  ccess .** or som
221b0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
221c0 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
221d0 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
221e0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c  atically .** del
221f0 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
22200 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
22210 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
22220 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
22230 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65   to the VFS laye
22240 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61  r xOpen() call a
22250 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  re those specifi
22260 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  ed.** by paramet
22270 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64  er vfsFlags ORed
22280 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
22290 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing:.**.**     S
222a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
222b0 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  RITE.**     SQLI
222c0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a  TE_OPEN_CREATE.*
222d0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
222e0 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  N_EXCLUSIVE.**  
222f0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
22300 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a  ELETEONCLOSE.*/.
22310 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
22320 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
22330 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
22340 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
22350 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
22360 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
22370 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
22380 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
22390 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
223a0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
223b0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
223c0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
223d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
223f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
22400 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22410 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
22420 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
22430 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
22440 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
22450 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
22460 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
22470 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
22480 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
22490 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
224a0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
224b0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
224c0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
224d0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
224e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
224f0 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
22500 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
22510 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
22520 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
22530 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
22540 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
22550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
22560 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
22570 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
22580 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
22590 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
225a0 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
225b0 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
225c0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
225d0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
225e0 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
225f0 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
22600 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
22610 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
22620 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
22630 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
22640 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
22650 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
22660 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
22670 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
22680 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
22690 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
226a0 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
226b0 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
226c0 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
226d0 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
226e0 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
226f0 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
22700 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
22710 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
22730 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
22740 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
22750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22780 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
22790 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
227a0 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
227b0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
227c0 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
227d0 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
227e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
227f0 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
22800 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
22810 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
22820 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
22830 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
22840 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
22850 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
22860 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
22870 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
22880 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
22890 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
228a0 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
228b0 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
228c0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
228d0 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
228e0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
228f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
22900 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20  tBusyhandler(.  
22910 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
22940 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
22950 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
22960 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
22970 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
22980 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
22990 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
229a0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
229b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
229c0 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
229d0 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
229e0 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d   */.){.  pPager-
229f0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
22a00 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
22a10 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
22a20 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
22a30 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66  andlerArg;..  if
22a40 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
22a50 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  >fd) ){.    void
22a60 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a   **ap = (void **
22a70 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  )&pPager->xBusyH
22a80 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65  andler;.    asse
22a90 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  rt( ((int(*)(voi
22aa0 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78  d *))(ap[0]))==x
22ab0 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20  BusyHandler );. 
22ac0 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d     assert( ap[1]
22ad0 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ==pBusyHandlerAr
22ae0 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g );.    sqlite3
22af0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
22b00 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
22b10 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48  LITE_FCNTL_BUSYH
22b20 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29  ANDLER, (void *)
22b30 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
22b40 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
22b50 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
22b60 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
22b70 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
22b80 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
22b90 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
22ba0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
22bb0 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
22bc0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
22bd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
22be0 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
22bf0 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
22c00 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
22c10 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
22c20 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
22c30 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
22c40 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49  E_IOERR, an SQLI
22c50 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62  TE_IOERR_xxx sub
22c60 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f  -code or SQLITE_
22c70 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  FULL)..**.** Oth
22c80 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f  erwise, if all o
22c90 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
22ca0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
22cb0 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65    * the new page
22cc0 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20   size (value of 
22cd0 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76  *pPageSize) is v
22ce0 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a  alid (a power .*
22cf0 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74  *     of two bet
22d00 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c  ween 512 and SQL
22d10 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
22d20 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61  E, inclusive), a
22d30 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
22d40 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
22d50 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
22d60 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ences, and.**.**
22d70 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
22d80 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20  e is either not 
22d90 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
22da0 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a  abase or it is.*
22db0 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f  *     an in-memo
22dc0 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
22dd0 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69   currently consi
22de0 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65  sts of zero page
22df0 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  s..**.** then th
22e00 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e pager object p
22e10 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
22e20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  to *pPageSize..*
22e30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
22e40 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64   size is changed
22e50 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
22e60 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65  tion uses sqlite
22e70 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a  3PagerMalloc() .
22e80 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e  ** to obtain a n
22e90 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  ew Pager.pTmpSpa
22ea0 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  ce buffer. If th
22eb0 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  is allocation at
22ec0 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c  tempt .** fails,
22ed0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
22ee0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
22ef0 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61  e page size rema
22f00 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a  ins unchanged. .
22f10 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ** In all other 
22f20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  cases, SQLITE_OK
22f30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
22f40 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
22f50 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  size is not chan
22f60 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61  ged, either beca
22f70 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65  use one of the e
22f80 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e  numerated.** con
22f90 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73  ditions above is
22fa0 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70   not true, the p
22fb0 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f  ager was in erro
22fc0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
22fd0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61  s.** function wa
22fe0 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63  s called, or bec
22ff0 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ause the memory 
23000 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
23010 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74  pt failed, .** t
23020 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69  hen *pPageSize i
23030 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64  s set to the old
23040 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20  , retained page 
23050 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75  size before retu
23060 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
23070 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
23080 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
23090 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53  ger, u32 *pPageS
230a0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
230b0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
230c0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
230d0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
230e0 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20  le to do a full 
230f0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
23100 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68  te() here, as th
23110 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
23120 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
23130 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72  rom within Pager
23140 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74  Open(), before t
23150 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66  he state.  ** of
23160 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
23170 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  t is internally 
23180 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a  consistent..  **
23190 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  ** At one poi
231a0 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nt this function
231b0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
231c0 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
231d0 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47  was in .  ** PAG
231e0 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
231f0 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f  But since PAGER_
23200 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72  ERROR state guar
23210 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a  antees that.  **
23220 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61   there is at lea
23230 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
23240 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
23250 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
23260 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  .  ** is a no-op
23270 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61   for that case a
23280 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75  nyhow..  */..  u
23290 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  32 pageSize = *p
232a0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
232b0 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
232c0 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
232d0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
232e0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
232f0 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70  IZE) );.  if( (p
23300 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
23310 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
23320 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69  e==0).   && sqli
23330 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
23340 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
23350 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67  e)==0 .   && pag
23360 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
23370 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e  e!=(u32)pPager->
23380 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20  pageSize .  ){. 
23390 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
233a0 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20  NULL;           
233b0 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70    /* New temp sp
233c0 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e  ace */.    i64 n
233d0 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69  Byte = 0;..    i
233e0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
233f0 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  e>PAGER_OPEN && 
23400 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
23410 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  d) ){.      rc =
23420 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
23430 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
23440 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
23450 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23460 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  _OK ){.      pNe
23470 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
23480 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61  te3PageMalloc(pa
23490 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
234a0 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20  f( !pNew ) rc = 
234b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
234c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
234d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
234e0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
234f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
23500 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
23510 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61  (Pgno)((nByte+pa
23520 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69  geSize-1)/pageSi
23530 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
23540 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
23550 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  geSize;.      sq
23560 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
23570 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
23580 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
23590 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
235a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
235b0 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
235c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
235d0 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
235e0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65   }.  }..  *pPage
235f0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
23600 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72  ageSize;.  if( r
23610 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23620 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65      if( nReserve
23630 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20  <0 ) nReserve = 
23640 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
23650 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52  ;.    assert( nR
23660 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
23670 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20  serve<1000 );.  
23680 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72    pPager->nReser
23690 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72  ve = (i16)nReser
236a0 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
236b0 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
236c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
236d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
236e0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
236f0 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
23700 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
23710 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
23720 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
23730 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
23740 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
23750 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
23760 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
23770 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
23780 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
23790 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
237a0 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
237b0 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
237c0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
237d0 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
237e0 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
237f0 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
23800 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
23810 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
23820 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
23830 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
23840 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
23850 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
23860 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
23870 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
23880 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
23890 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
238a0 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
238b0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
238c0 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
238d0 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
238e0 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
238f0 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
23900 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
23910 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
23920 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
23930 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
23940 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
23950 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
23960 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
23970 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
23980 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
23990 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
239a0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
239b0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
239c0 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
239d0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
239e0 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
239f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23a00 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
23a10 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
23a20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
23a30 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20  AGER_OPEN );    
23a40 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79    /* Called only
23a50 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   by OP_MaxPgcnt 
23a60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
23a70 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61  ger->mxPgno>=pPa
23a80 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20  ger->dbSize );  
23a90 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65  /* OP_MaxPgcnt e
23aa0 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a  nforces this */.
23ab0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
23ac0 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
23ad0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23ae0 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
23af0 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
23b00 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
23b10 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
23b20 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
23b30 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
23b40 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
23b50 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
23b60 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
23b70 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
23b80 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
23b90 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
23ba0 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
23bb0 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
23bc0 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
23bd0 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
23be0 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
23bf0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
23c00 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
23c10 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
23c20 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
23c30 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
23c40 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
23c50 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
23c60 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
23c70 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
23c80 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
23c90 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
23ca0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
23cb0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
23cc0 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
23cd0 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
23ce0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
23cf0 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
23d00 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
23d10 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
23d20 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
23d30 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
23d40 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
23d50 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
23d60 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
23d70 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
23d80 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
23d90 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
23da0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
23db0 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
23dc0 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
23dd0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
23de0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
23df0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
23e00 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28  transient file (
23e10 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20  zFilename==""), 
23e20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20  or.** opened on 
23e30 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e  a file less than
23e40 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   N bytes in size
23e50 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  , the output buf
23e60 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64  fer is.** zeroed
23e70 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
23e80 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74  eturned. The rat
23e90 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20  ionale for this 
23ea0 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a  is that this .**
23eb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
23ec0 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  d to read databa
23ed0 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20  se headers, and 
23ee0 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20  a new transient 
23ef0 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64  or.** zero sized
23f00 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20   database has a 
23f10 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73  header than cons
23f20 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
23f30 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   zeroes..**.** I
23f40 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61  f any IO error a
23f50 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  part from SQLITE
23f60 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
23f70 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  D is encountered
23f80 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63  ,.** the error c
23f90 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
23fa0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e  to the caller an
23fb0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
23fc0 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
23fd0 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64  buffer undefined
23fe0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23ff0 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
24000 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
24010 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
24020 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
24030 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24040 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
24050 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
24060 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
24070 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
24080 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
24090 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
240a0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
240b0 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d  led by btree imm
240c0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63  ediately after c
240d0 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
240e0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20   Pager object.  
240f0 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65  There has not be
24100 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  en an opportunit
24110 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a  y to transition.
24120 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65    ** to WAL mode
24130 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   yet..  */.  ass
24140 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
24150 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
24160 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
24170 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
24180 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
24190 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
241a0 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
241b0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
241c0 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
241d0 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
241e0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
241f0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
24200 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24210 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
24220 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24230 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24240 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
24250 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64  lled when a read
24260 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
24270 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  open on.** the p
24280 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73  ager. It returns
24290 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
242a0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
242b0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
242c0 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
242d0 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
242e0 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
242f0 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
24300 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
24310 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
24320 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f   1 page file..*/
24330 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
24340 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
24350 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
24360 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  pnPage){.  asser
24370 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24380 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
24390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
243a0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
243b0 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
243c0 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20  ED );.  *pnPage 
243d0 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64  = (int)pPager->d
243e0 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  bSize;.}.../*.**
243f0 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
24400 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
24410 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
24420 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
24430 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
24440 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
24450 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
24460 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
24470 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
24480 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
24490 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
244a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
244b0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
244c0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
244d0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
244e0 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
244f0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
24500 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
24510 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
24520 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
24530 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
24540 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
24550 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
24560 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
24570 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
24580 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
24590 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
245a0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
245b0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
245c0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
245d0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
245e0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
245f0 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
24600 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
24610 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
24620 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
24630 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
24640 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
24650 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
24660 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
24670 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
24680 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
246b0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
246c0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
246d0 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
246e0 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
246f0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
24700 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
24710 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20  dy held, or one 
24720 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69  of the transisti
24730 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
24740 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
24750 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
24760 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
24770 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
24780 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
24790 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
247a0 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
247b0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
247c0 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29  eLock>=locktype)
247d0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
247e0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
247f0 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
24800 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
24810 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
24820 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
24830 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
24840 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
24850 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  ).  );..  do {. 
24860 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
24870 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b  kDb(pPager, lock
24880 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
24890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
248a0 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
248b0 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
248c0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
248d0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
248e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
248f0 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61  ion assertTrunca
24900 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
24910 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74  ger) checks that
24920 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
24930 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
24940 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20  e for all dirty 
24950 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
24960 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
24970 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68  e:.**.**   a) Th
24980 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
24990 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
249a0 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
249b0 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
249c0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
249d0 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73   image, in pages
249e0 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  , OR.**.**   b) 
249f0 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  if the page cont
24a00 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e  ent were written
24a10 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69   at this time, i
24a20 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20  t would not.**  
24a30 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79      be necessary
24a40 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
24a50 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75  rrent content ou
24a60 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  t to the sub-jou
24a70 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73  rnal.**      (as
24a80 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66   determined by f
24a90 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75  unction subjRequ
24aa0 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a  iresPage())..**.
24ab0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74  ** If the condit
24ac0 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20  ion asserted by 
24ad0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65  this function we
24ae0 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
24af0 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
24b00 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69  ge were to be di
24b10 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65  scarded from the
24b20 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70   cache via the p
24b30 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
24b40 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74  routine, pagerSt
24b50 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74  ress() would not
24b60 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
24b70 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
24b80 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
24b90 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61  se file. If a sa
24ba0 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
24bb0 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20  ion were rolled 
24bc0 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68  back after.** th
24bd0 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65  is happened, the
24be0 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
24bf0 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
24c00 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
24c10 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
24c20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
24c30 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
24c40 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
24c50 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
24c60 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
24c70 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
24c80 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
24c90 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
24ca0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
24cb0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
24cc0 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
24cd0 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
24ce0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
24cf0 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
24d00 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
24d10 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
24d20 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
24d30 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
24d40 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
24d50 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
24d60 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
24d70 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
24d80 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
24d90 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
24da0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
24db0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
24dc0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
24dd0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
24de0 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
24df0 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
24e00 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
24e10 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
24e20 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
24e30 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
24e40 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
24e50 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
24e60 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
24e70 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
24e80 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
24e90 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
24ea0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
24eb0 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
24ec0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
24ed0 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
24ee0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
24ef0 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
24f00 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
24f10 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
24f20 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
24f30 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
24f40 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
24f50 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
24f60 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
24f70 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
24f80 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
24f90 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
24fa0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
24fb0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
24fc0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
24fd0 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
24fe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
24ff0 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74  nly called right
25000 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
25010 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
25020 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66  ..** Once this f
25030 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  unction has been
25040 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61   called, the tra
25050 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69  nsaction must ei
25060 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65  ther be.** rolle
25070 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  d back or commit
25080 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73  ted. It is not s
25090 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  afe to call this
250a0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a   function and.**
250b0 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77   then continue w
250c0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
250d0 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  tabase..*/.void 
250e0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
250f0 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
25100 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
25110 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
25120 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
25130 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
25140 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
25150 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
25160 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
25170 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
25180 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f  Page;..  /* At o
25190 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64  ne point the cod
251a0 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73  e here called as
251b0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
251c0 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a  traint() to.  **
251d0 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   ensure that all
251e0 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75   pages being tru
251f0 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74  ncated away by t
25200 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72  his operation ar
25210 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f  e,.  ** if one o
25220 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
25230 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73  s are open, pres
25240 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70  ent in the savep
25250 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  oint .  ** journ
25260 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  al so that they 
25270 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
25280 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  if the savepoint
25290 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20   is rolled.  ** 
252a0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f  back. This is no
252b0 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72   longer necessar
252c0 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  y as this functi
252d0 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20  on is now only. 
252e0 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74   ** called right
252f0 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
25300 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
25310 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68  . So although th
25320 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62  e .  ** Pager ob
25330 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68  ject may still h
25340 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ave open savepoi
25350 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65  nts (Pager.nSave
25360 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a  point!=0), .  **
25370 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20   they cannot be 
25380 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20  rolled back. So 
25390 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  the assertTrunca
253a0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63  teConstraint() c
253b0 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c  all.  ** is no l
253c0 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a  onger correct. *
253d0 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.}.../*.** This
253e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
253f0 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  led before attem
25400 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  pting a hot-jour
25410 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74  nal rollback. It
25420 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f  .** syncs the jo
25430 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69  urnal file to di
25440 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50  sk, then sets pP
25450 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
25460 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20   to the.** size 
25470 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
25480 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ile so that the 
25490 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
254a0 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a   routine knows.*
254b0 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  * that the entir
254c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
254d0 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  as been synced..
254e0 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20  **.** Syncing a 
254f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64  hot-journal to d
25500 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  isk before attem
25510 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
25520 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a   back ensures .*
25530 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  * that if a powe
25540 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r-failure occurs
25550 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
25560 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73  back, the proces
25570 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70  s that.** attemp
25580 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  ts rollback foll
25590 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63  owing system rec
255a0 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73  overy sees the s
255b0 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63  ame journal.** c
255c0 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70  ontent as this p
255d0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rocess..**.** If
255e0 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
255f0 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c   as planned, SQL
25600 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25610 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
25620 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
25630 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
25640 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63  ic int pagerSync
25650 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
25660 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
25670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25680 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
25690 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
256a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
256b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
256c0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
256d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
256e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
256f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
25700 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
25710 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a  >jfd, &pPager->j
25720 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a  ournalHdr);.  }.
25730 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25740 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
25750 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
25760 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
25770 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
25780 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
25790 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
257a0 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
257b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
257c0 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
257d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
257e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
257f0 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
25800 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
25810 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
25820 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
25830 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
25840 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
25850 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
25860 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
25870 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
25880 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
25890 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
258a0 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
258b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
258c0 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
258d0 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
258e0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
258f0 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
25900 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
25910 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
25920 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
25930 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
25940 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
25950 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
25960 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
25970 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
25980 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
25990 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
259a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
259b0 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
259c0 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
259d0 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
259e0 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65  mpSpace;..  asse
259f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
25a00 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
25a10 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ;.  disable_simu
25a20 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
25a30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
25a40 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
25a50 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
25a60 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  rCode = 0; */.  
25a70 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
25a80 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eMode = 0;.#ifnd
25a90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
25aa0 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43  AL.  sqlite3WalC
25ab0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61  lose(pPager->pWa
25ac0 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  l, pPager->ckptS
25ad0 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72  yncFlags, pPager
25ae0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70  ->pageSize, pTmp
25af0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61  );.  pPager->pWa
25b00 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  l = 0;.#endif.  
25b10 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
25b20 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
25b30 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
25b40 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
25b50 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
25b60 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e   it is open, syn
25b70 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
25b80 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
25b90 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  g UnlockAndRollb
25ba0 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ack..    ** If t
25bb0 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c  his is not done,
25bc0 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65   then an unsynce
25bd0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
25be0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20   open journal . 
25bf0 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62     ** file may b
25c00 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e  e played back in
25c10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
25c20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
25c30 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20  ure occurs .    
25c40 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73  ** while this is
25c50 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20   happening, the 
25c60 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
25c70 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20  ecome corrupt.. 
25c80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
25c90 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
25ca0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
25cb0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
25cc0 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65  , shift the page
25cd0 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  r.    ** into th
25ce0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54  e ERROR state. T
25cf0 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63  his causes Unloc
25d00 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20  kAndRollback to 
25d10 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a  unlock the.    *
25d20 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  * database and c
25d30 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
25d40 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74   file without at
25d50 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
25d60 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20   it.    ** back 
25d70 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20  or finalize it. 
25d80 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73  The next databas
25d90 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65  e user will have
25da0 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e   to do hot-journ
25db0 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  al.    ** rollba
25dc0 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73  ck before access
25dd0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
25de0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
25df0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
25e00 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
25e10 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
25e20 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63  Pager, pagerSync
25e30 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
25e40 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
25e50 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
25e60 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
25e70 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
25e80 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
25e90 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
25ea0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
25eb0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c   PAGERTRACE(("CL
25ec0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
25ed0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
25ee0 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
25ef0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
25f00 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
25f10 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
25f20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
25f30 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73  pPager->fd);.  s
25f40 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
25f50 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  Tmp);.  sqlite3P
25f60 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65  cacheClose(pPage
25f70 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69  r->pPCache);..#i
25f80 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
25f90 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67  CODEC.  if( pPag
25fa0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29  er->xCodecFree )
25fb0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
25fc0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  ree(pPager->pCod
25fd0 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ec);.#endif..  a
25fe0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
25ff0 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  aSavepoint && !p
26000 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
26010 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  l );.  assert( !
26020 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
26030 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
26040 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a  Pager->sjfd) );.
26050 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
26060 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
26070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26080 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
26090 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
260a0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
260b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
260c0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61  ge number for pa
260d0 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20  ge pPg..*/.Pgno 
260e0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
260f0 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
26100 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
26110 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  g->pgno;.}.#endi
26120 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
26130 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
26140 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
26150 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  pPg..*/.void sql
26160 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
26170 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c  age *pPg){.  sql
26180 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50  ite3PcacheRef(pP
26190 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  g);.}../*.** Syn
261a0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49  c the journal. I
261b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
261c0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
261d0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
261e0 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
261f0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
26200 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
26210 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
26220 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
26230 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74   and can be rest
26240 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ored in the even
26250 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t of a hot-journ
26260 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  al rollback..**.
26270 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  ** If the Pager.
26280 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  noSync flag is s
26290 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  et, then this fu
262a0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
262b0 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  p..** Otherwise,
262c0 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71   the actions req
262d0 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20  uired depend on 
262e0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
262f0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76   and the .** dev
26300 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
26310 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d  ics of the file-
26320 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
26330 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
26340 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26350 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
26360 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
26370 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
26380 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
26390 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
263a0 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
263b0 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
263c0 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
263d0 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
263e0 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
263f0 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
26400 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
26410 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
26420 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
26430 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
26440 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
26450 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
26460 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
26470 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
26480 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
26490 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
264a0 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
264b0 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
264c0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
264d0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
264e0 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
264f0 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
26500 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
26510 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
26520 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
26530 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
26540 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
26550 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
26560 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
26570 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
26580 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
26590 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
265a0 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
265b0 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
265c0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
265d0 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
265e0 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
265f0 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
26600 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
26610 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
26620 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
26630 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
26640 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
26650 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
26660 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
26670 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   this routine cl
26680 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e  ears the PGHDR_N
26690 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66  EED_SYNC flag of
266a0 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20   every .** page 
266b0 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69  currently held i
266c0 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20  n memory before 
266d0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
266e0 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a  _OK. If an IO.**
266f0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
26700 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  tered, then the 
26710 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
26720 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
26730 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
26740 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
26750 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
26760 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20  , int newHdr){. 
26770 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26790 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
267a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
267b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
267c0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
267d0 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
267e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
267f0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
26800 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
26810 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
26820 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
26830 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
26840 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
26850 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
26860 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
26870 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
26880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26890 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
268a0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
268b0 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
268c0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
268d0 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
268e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
268f0 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  d) && pPager->jo
26900 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
26910 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
26920 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ORY ){.      con
26930 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c  st int iDc = sql
26940 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
26950 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
26960 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
26970 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
26980 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
26990 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
269a0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
269b0 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
269c0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
269d0 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61  ock deals with a
269e0 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65  n obscure proble
269f0 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63  m. If the last c
26a00 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20  onnection.      
26a10 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
26a20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
26a30 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69   was operating i
26a40 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75  n persistent-jou
26a50 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
26a60 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
26a70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
26a80 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63  at this point ac
26a90 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72  tually be larger
26aa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e  .        ** than
26ab0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
26ac0 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20  f bytes. If the 
26ad0 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68  next thing in th
26ae0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
26af0 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e    ** file happen
26b00 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61  s to be a journa
26b10 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65  l-header (writte
26b20 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
26b30 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
26b40 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27  ious connection'
26b50 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  s transaction), 
26b60 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70  and a crash or p
26b70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20  ower-failure .  
26b80 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20        ** occurs 
26b90 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70  after nRec is up
26ba0 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65  dated but before
26bb0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
26bc0 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20   writes .       
26bd0 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73   ** anything els
26be0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
26bf0 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74   file (or commit
26c00 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73  s/rolls back its
26c10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61   .        ** tra
26c20 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20  nsaction), then 
26c30 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d  SQLite may becom
26c40 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20  e confused when 
26c50 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  doing the .     
26c60 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
26c70 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  l rollback follo
26c80 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49  wing recovery. I
26c90 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20  t may roll back 
26ca0 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  all.        ** o
26cb0 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
26cc0 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72  ns data, then pr
26cd0 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67  oceed to rolling
26ce0 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20   back the old,. 
26cf0 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66         ** out-of
26d00 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20  -date data that 
26d10 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61  follows it. Data
26d20 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
26d30 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
26d40 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61      ** To work a
26d50 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74  round this, if t
26d60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26d70 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63  does appear to c
26d80 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a  ontain.        *
26d90 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72  * a valid header
26da0 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72   following Pager
26db0 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65  .journalOff, the
26dc0 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20  n write a 0x00. 
26dd0 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74         ** byte t
26de0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
26df0 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20  t to prevent it 
26e00 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67  from being recog
26e10 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  nized..        *
26e20 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72  *.        ** Var
26e30 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66  iable iNextHdrOf
26e40 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74  fset is set to t
26e50 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69  he offset at whi
26e60 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  ch this.        
26e70 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68  ** problematic h
26e80 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72  eader will occur
26e90 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  , if it exists. 
26ea0 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a  aMagic is used .
26eb0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20          ** as a 
26ec0 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
26ed0 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20   to inspect the 
26ee0 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20  first couple of 
26ef0 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20  bytes of.       
26f00 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61   ** the potentia
26f10 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  l journal header
26f20 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26f30 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64       i64 iNextHd
26f40 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  rOffset;.       
26f50 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20   u8 aMagic[8];. 
26f60 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65         u8 zHeade
26f70 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
26f80 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20  lMagic)+4];..   
26f90 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61       memcpy(zHea
26fa0 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
26fb0 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
26fc0 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
26fd0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
26fe0 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
26ff0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70  ournalMagic)], p
27000 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20  Pager->nRec);.. 
27010 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f         iNextHdrO
27020 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48  ffset = journalH
27030 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
27040 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
27050 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
27060 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
27070 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 8, iNextHdrOff
27080 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  set);.        if
27090 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
270a0 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61  && 0==memcmp(aMa
270b0 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
270c0 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20  ic, 8) ){.      
270d0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
270e0 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30   u8 zerobyte = 0
270f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
27100 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
27110 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65  pPager->jfd, &ze
27120 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74  robyte, 1, iNext
27130 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
27140 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
27150 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27160 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
27170 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
27180 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
27190 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
271a0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ..        /* Wri
271b0 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
271c0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
271d0 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
271e0 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
271f0 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
27200 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
27210 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
27220 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
27230 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
27240 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
27250 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
27260 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
27270 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
27280 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
27290 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
272a0 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  llback..        
272b0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
272c0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
272d0 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73  ed if the persis
272e0 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f  tent media suppo
272f0 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  rts the.        
27300 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  ** SAFE_APPEND p
27310 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65  roperty. Because
27320 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
27330 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
27340 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72   .        ** for
27350 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f   garbage data to
27360 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
27370 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52  the file, the nR
27380 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20  ec field.       
27390 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64   ** is populated
273a0 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46   with 0xFFFFFFFF
273b0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
273c0 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l header is writ
273d0 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ten.        ** a
273e0 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  nd never needs t
273f0 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
27400 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27410 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
27420 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
27430 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
27440 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
27450 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
27460 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
27470 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
27480 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
27490 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
274a0 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
274b0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
274c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
274d0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
274e0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
274f0 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
27500 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27510 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
27520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27530 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
27540 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67  %p %lld\n", pPag
27550 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
27560 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20  nalHdr));.      
27570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27580 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20  Write(.         
27590 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20     pPager->jfd, 
275a0 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
275b0 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72  zHeader), pPager
275c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
275d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
275e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
275f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
27600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27610 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
27620 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
27630 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47  ) ){.        PAG
27640 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
27650 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
27660 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
27670 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
27680 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
27690 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
276a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
276b0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
276c0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
276d0 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20  Flags| .        
276e0 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46    (pPager->syncF
276f0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  lags==SQLITE_SYN
27700 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59  C_FULL?SQLITE_SY
27710 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20  NC_DATAONLY:0). 
27720 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
27730 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27740 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
27750 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
27760 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
27770 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
27780 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69  rnalOff;.      i
27790 66 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d  f( newHdr && 0==
277a0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
277b0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
277c0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
277d0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
277e0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
277f0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
27800 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
27810 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
27820 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
27830 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27840 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
27850 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
27860 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
27870 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73  .  }..  /* Unles
27880 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
27890 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74  n noSync mode, t
278a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
278b0 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73  was just .  ** s
278c0 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63  uccessfully sync
278d0 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ed. Either way, 
278e0 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
278f0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
27900 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65  n .  ** all page
27910 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
27920 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
27930 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
27940 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72  Cache);.  pPager
27950 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
27960 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20  _WRITER_DBMOD;. 
27970 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
27980 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
27990 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
279a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
279b0 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
279c0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e   is the first in
279d0 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
279e0 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f  f dirty pages co
279f0 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68  nnected.** by th
27a00 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
27a10 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e  ointer. This fun
27a20 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63  ction writes eac
27a30 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  h one of the.** 
27a40 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
27a50 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74  in the list to t
27a60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27a70 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  . The argument m
27a80 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72  ay.** be NULL, r
27a90 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65  epresenting an e
27aa0 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68  mpty list. In th
27ab0 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e  is case this fun
27ac0 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f  ction is.** a no
27ad0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
27ae0 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ager must hold a
27af0 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
27b00 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69  ED lock when thi
27b10 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
27b20 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20   called. Before 
27b30 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67  writing anything
27b40 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
27b50 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b   file, this lock
27b60 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20  .** is upgraded 
27b70 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
27b80 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
27b90 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
27ba0 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ined,.** SQLITE_
27bb0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
27bc0 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20   and no data is 
27bd0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
27be0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
27bf0 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65   .** If the page
27c00 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  r is a temp-file
27c10 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61   pager and the a
27c20 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65  ctual file-syste
27c30 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74  m file.** is not
27c40 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   yet open, it is
27c50 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65   created and ope
27c60 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  ned before any d
27c70 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ata is .** writt
27c80 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  en out..**.** On
27c90 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  ce the lock has 
27ca0 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e  been upgraded an
27cb0 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c  d, if necessary,
27cc0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
27cd0 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61  ,.** the pages a
27ce0 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  re written out t
27cf0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
27d00 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65  ile in list orde
27d10 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20  r. Writing.** a 
27d20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20  page is skipped 
27d30 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68  if it meets eith
27d40 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  er of the follow
27d50 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a  ing criteria:.**
27d60 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
27d70 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
27d80 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  er than Pager.db
27d90 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  Size, or.**   * 
27da0 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  The PGHDR_DONT_W
27db0 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74  RITE flag is set
27dc0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
27dd0 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f  .** If writing o
27de0 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73  ut a page causes
27df0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27e00 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65  le to grow, Page
27e10 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20  r.dbFileSize.** 
27e20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
27e30 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20  dingly. If page 
27e40 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74  1 is written out
27e50 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
27e60 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61   cached.** in Pa
27e70 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
27e80 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
27e90 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c  atch the new val
27ea0 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
27eb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27ec0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
27ed0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
27ee0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
27ef0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
27f00 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
27f10 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72  occurs, an IO er
27f20 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
27f30 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65  rned. Or, if the
27f40 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
27f50 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74  cannot.** be obt
27f60 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55  ained, SQLITE_BU
27f70 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
27f80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
27f90 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
27fa0 73 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  st(Pager *pPager
27fb0 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  , PgHdr *pList){
27fc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27fd0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
27fe0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27ff0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
28000 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
28010 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72   only called for
28020 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73   rollback pagers
28030 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44   in WRITER_DBMOD
28040 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73   state. */.  ass
28050 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
28060 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  l(pPager) );.  a
28070 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
28080 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
28090 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61  TER_DBMOD );.  a
280a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
280b0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
280c0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
280d0 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
280e0 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
280f0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
28100 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
28110 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
28120 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
28130 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
28140 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
28150 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
28160 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
28170 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
28180 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
28190 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
281a0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
281b0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
281c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
281d0 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
281e0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
281f0 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
28200 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
28210 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
28220 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
28230 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20    /* Before the 
28240 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76  first write, giv
28250 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74  e the VFS a hint
28260 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e   of what the fin
28270 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a  al.  ** file siz
28280 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a  e will be..  */.
28290 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
282a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
282b0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
282c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
282d0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
282e0 64 62 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64  dbSize>pPager->d
282f0 62 48 69 6e 74 53 69 7a 65 20 29 7b 0a 20 20 20  bHintSize ){.   
28300 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
28310 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e  zFile = pPager->
28320 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
28330 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72  te3_int64)pPager
28340 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71  ->dbSize;.    sq
28350 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
28360 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
28370 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
28380 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69  SIZE_HINT, &szFi
28390 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  le);.    pPager-
283a0 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
283b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
283c0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
283d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
283e0 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
283f0 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
28400 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
28410 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
28420 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
28430 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
28440 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
28450 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
28460 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
28470 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
28480 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
28490 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
284a0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
284b0 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
284c0 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
284d0 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
284e0 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
284f0 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
28500 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
28510 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
28520 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
28530 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
28540 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
28550 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
28560 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
28570 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
28580 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
28590 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
285a0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
285b0 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
285c0 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
285d0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
285e0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
285f0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
28600 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
28610 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
28620 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
28630 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
28660 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
28670 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
28680 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
28690 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
286a0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
286b0 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
286c0 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
286d0 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
286e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f  ;..      /* Enco
286f0 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
28700 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  */.      CODEC2(
28710 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
28720 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72  Data, pgno, 6, r
28730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28740 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20  EM, pData);..   
28750 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20     /* Write out 
28760 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a  the page data. *
28770 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
28780 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
28790 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
287a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
287b0 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20   offset);..     
287c0 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61   /* If page 1 wa
287d0 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  s just written, 
287e0 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46  update Pager.dbF
287f0 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68  ileVers to match
28800 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
28810 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69  lue now stored i
28820 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
28830 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20  ile. If writing 
28840 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  this .      ** p
28850 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64  age caused the d
28860 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
28870 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46  grow, update dbF
28880 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20  ileSize. .      
28890 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  */.      if( pgn
288a0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
288b0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
288c0 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
288d0 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
288e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
288f0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
28900 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
28910 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
28920 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
28930 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
28940 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
28950 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
28960 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
28970 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  E]++;..      /* 
28980 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
28990 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
289a0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
289b0 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
289c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
289d0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
289e0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
289f0 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
28a00 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
28a10 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
28a20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
28a30 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
28a50 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
28a60 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
28a70 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
28a80 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
28a90 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
28aa0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
28ab0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
28ac0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
28ad0 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
28ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
28af0 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52  ERTRACE(("NOSTOR
28b00 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
28b10 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28b20 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  , pgno));.    }.
28b30 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
28b40 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20  gehash(pList);. 
28b50 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
28b60 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
28b70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28b80 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
28b90 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
28ba0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49   file is open. I
28bb0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
28bc0 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66  open, this .** f
28bd0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
28be0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
28bf0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
28c00 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
28c10 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
28c20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c  plan. An .** SQL
28c30 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
28c40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
28c50 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
28c60 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  o sqlite3OsOpen(
28c70 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a  ) .** fails..*/.
28c80 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
28c90 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
28ca0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
28cb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28cc0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
28cd0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
28ce0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
28cf0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
28d00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
28d10 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
28d20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
28d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
28d40 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
28d50 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d  er->sjfd);.    }
28d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
28d70 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
28d80 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
28d90 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  jfd, SQLITE_OPEN
28da0 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
28db0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
28dc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   rc;.}../*.** Ap
28dd0 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66  pend a record of
28de0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
28df0 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74  te of page pPg t
28e00 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
28e10 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  l. .** It is the
28e20 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
28e30 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73  ibility to use s
28e40 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
28e50 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74  ) to check .** t
28e60 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79  hat it is really
28e70 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
28e80 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
28e90 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
28ea0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
28eb0 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   the bit corresp
28ec0 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70  onding to pPg->p
28ed0 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65  gno in the bitve
28ee0 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70  cs.** for all op
28ef0 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65  en savepoints be
28f00 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
28f10 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
28f20 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
28f30 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
28f40 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
28f50 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  l, an IO.** erro
28f60 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74  r code if the at
28f70 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
28f80 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
28f90 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
28fa0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
28fb0 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77  a malloc fails w
28fc0 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62  hile setting a b
28fd0 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e  it in a savepoin
28fe0 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a  t.** bitvec..*/.
28ff0 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
29000 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20  urnalPage(PgHdr 
29010 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pPg){.  int rc 
29020 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
29030 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
29040 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
29050 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
29060 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
29070 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
29080 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
29090 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66   sub-journal, if
290a0 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
290b0 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ady been opened 
290c0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
290d0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
290e0 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
290f0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
29100 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65  jfd) || pagerUse
29110 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
29120 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
29130 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
29140 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  || pPager->nSubR
29150 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
29160 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
29170 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
29180 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72     || pageInJour
29190 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20 20  nal(pPg) .      
291a0 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e     || pPg->pgno>
291b0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
291c0 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ze .    );.    r
291d0 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
291e0 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  al(pPager);..   
291f0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a   /* If the sub-j
29200 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65  ournal was opene
29210 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28  d successfully (
29220 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f  or was already o
29230 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69  pen),.    ** wri
29240 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  te the journal r
29250 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66  ecord into the f
29260 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ile.  */.    if(
29270 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29280 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
29290 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
292a0 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  ;.      i64 offs
292b0 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72  et = (i64)pPager
292c0 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->nSubRec*(4+pPa
292d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
292e0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
292f0 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44  a2;.  .      COD
29300 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
29310 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
29320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
29330 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
29340 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
29350 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
29360 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
29370 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
29380 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
29390 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
293a0 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  ts(pPager->sjfd,
293b0 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67   offset, pPg->pg
293c0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
293d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
293e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
293f0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
29400 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32  er->sjfd, pData2
29410 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
29420 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
29430 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29440 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
29450 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
29460 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20  er->nSubRec++;. 
29470 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
29480 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20  r->nSavepoint>0 
29490 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54  );.    rc = addT
294a0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
294b0 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
294c0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
294d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
294e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
294f0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
29500 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e  cache layer when
29510 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20   it has reached 
29520 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d  some.** soft mem
29530 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66  ory limit. The f
29540 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
29550 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
29560 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  Pager object.** 
29570 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a  (cast as a void*
29580 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20  ). The pager is 
29590 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c  always 'purgeabl
295a0 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  e' (not an in-me
295b0 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
295c0 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ). The second ar
295d0 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65  gument is a refe
295e0 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20  rence to a page 
295f0 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72  that is .** curr
29600 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20  ently dirty but 
29610 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
29620 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54  ng references. T
29630 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c  he page.** is al
29640 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  ways associated 
29650 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f  with the Pager o
29660 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
29670 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
29680 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
29690 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75  e job of this fu
296a0 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b  nction is to mak
296b0 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77  e pPg clean by w
296c0 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65  riting its conte
296d0 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68  nts.** out to th
296e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
296f0 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   if possible. Th
29700 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73  is may involve s
29710 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f  yncing the.** jo
29720 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a  urnal file. .**.
29730 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
29740 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  , sqlite3PcacheM
29750 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61  akeClean() is ca
29760 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  lled on the page
29770 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
29780 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
29790 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
297a0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
297b0 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61  o make the.** pa
297c0 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f  ge clean, the IO
297d0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
297e0 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
297f0 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  page cannot be.*
29800 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72  * made clean for
29810 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73   some other reas
29820 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  on, but no error
29830 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
29840 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
29850 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
29860 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
29870 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
29880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29890 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64  pagerStress(void
298a0 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29   *p, PgHdr *pPg)
298b0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
298c0 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a  r = (Pager *)p;.
298d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
298e0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
298f0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
29900 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
29910 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
29920 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f  DR_DIRTY );..  /
29930 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53  * The doNotSyncS
29940 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73 65 74  pill flag is set
29950 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
29960 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
29970 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
29980 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
29990 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
299a0 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
299b0 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
299c0 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
299d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
299e0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
299f0 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
29a00 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
29a10 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
29a20 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
29a30 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
29a40 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69 74 73  ll flag inhibits
29a50 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c   all cache spill
29a60 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ing regardless o
29a70 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f  f whether.  ** o
29a80 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20  r not a sync is 
29a90 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20  required.  This 
29aa0 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 61 20  is set during a 
29ab0 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  rollback..  **. 
29ac0 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20   ** Spilling is 
29ad0 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20  also prohibited 
29ae0 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72  when in an error
29af0 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61   state since tha
29b00 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61  t could.  ** lea
29b10 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
29b20 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74  rruption.   In t
29b30 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
29b40 6d 65 6e 74 61 74 6f 6e 20 69 74 20 0a 20 20 2a  mentaton it .  *
29b50 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  * is impossible 
29b60 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63 68  for sqlite3Pcach
29b70 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20 63  eFetch() to be c
29b80 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61 74  alled with creat
29b90 65 46 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20 77 68  eFlag==1.  ** wh
29ba0 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ile in the error
29bb0 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74   state, hence it
29bc0 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
29bd0 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
29be0 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65  to.  ** be calle
29bf0 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  d in the error s
29c00 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c  tate.  Neverthel
29c10 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20  ess, we include 
29c20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74  a NEVER().  ** t
29c30 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f  est for the erro
29c40 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61 66  r state as a saf
29c50 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66  eguard against f
29c60 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20  uture changes.. 
29c70 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
29c80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
29c90 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29ca0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
29cb0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20  r->doNotSpill ) 
29cc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29cd0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
29ce0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26  doNotSyncSpill &
29cf0 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  & (pPg->flags & 
29d00 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
29d10 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
29d20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29d30 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ..  pPg->pDirty 
29d40 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72  = 0;.  if( pager
29d50 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
29d60 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  {.    /* Write a
29d70 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f   single frame fo
29d80 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74  r this page to t
29d90 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69  he log. */.    i
29da0 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
29db0 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20  age(pPg) ){ .   
29dc0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
29dd0 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20  alPage(pPg); .  
29de0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
29df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29e00 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
29e10 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
29e20 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Pg, 0, 0);.    }
29e30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
29e40 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
29e50 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71  rnal file if req
29e60 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  uired. */.    if
29e70 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
29e80 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20  DR_NEED_SYNC .  
29e90 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
29ea0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
29eb0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
29ec0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  ){.      rc = sy
29ed0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
29ee0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 1);.    }.  . 
29ef0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
29f00 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73  e number of this
29f10 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20   page is larger 
29f20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
29f30 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20   size of.    ** 
29f40 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
29f50 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20  ge, it may need 
29f60 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  to be written to
29f70 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
29f80 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
29f90 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
29fa0 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65  l to pager_write
29fb0 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f  _pagelist() belo
29fc0 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a  w will not.    *
29fd0 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65  * actually write
29fe0 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
29ff0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
2a000 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f      **.    ** Co
2a010 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
2a020 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  wing sequence of
2a030 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a   events:.    **.
2a040 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a      **   BEGIN;.
2a050 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72      **     <jour
2a060 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20  nal page X>.    
2a070 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70  **     <modify p
2a080 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
2a090 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a    SAVEPOINT sp;.
2a0a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68      **       <sh
2a0b0 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69  rink database fi
2a0c0 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20  le to Y pages>. 
2a0d0 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65     **       page
2a0e0 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a  rStress(page X).
2a0f0 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42      **     ROLLB
2a100 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a  ACK TO sp;.    *
2a110 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59  *.    ** If (X>Y
2a120 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67  ), then when pag
2a130 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c  erStress is call
2a140 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e  ed page X will n
2a150 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ot be written.  
2a160 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20    ** out to the 
2a170 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62  database file, b
2a180 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70  ut will be dropp
2a190 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
2a1a0 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20  e. Then,.    ** 
2a1b0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52  following the "R
2a1c0 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73  OLLBACK TO sp" s
2a1d0 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e  tatement, readin
2a1e0 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65  g page X will re
2a1f0 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66  ad.    ** data f
2a200 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2a210 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c   file. This will
2a220 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20   be the copy of 
2a230 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20  page X as it.   
2a240 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65   ** was when the
2a250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
2a260 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20  rted, not as it 
2a270 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f  was when "SAVEPO
2a280 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77  INT sp".    ** w
2a290 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20  as executed..   
2a2a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
2a2b0 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72  olution is to wr
2a2c0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
2a2d0 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20  data for page X 
2a2e0 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
2a2f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
2a300 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20  e now (if it is 
2a310 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72  not already ther
2a320 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77  e), so that it w
2a330 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  ill.    ** be re
2a340 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75  stored to its cu
2a350 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e  rrent value when
2a360 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
2a370 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a  O sp" is .    **
2a380 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a   executed..    *
2a390 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  /.    if( NEVER(
2a3a0 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  .        rc==SQL
2a3b0 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70  ITE_OK && pPg->p
2a3c0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  gno>pPager->dbSi
2a3d0 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72  ze && subjRequir
2a3e0 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20  esPage(pPg).    
2a3f0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2a400 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2a410 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  Pg);.    }.  .  
2a420 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
2a430 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2a440 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64  age out to the d
2a450 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2a460 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2a470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a480 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
2a490 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2a4a0 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
2a4b0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2a4c0 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
2a4d0 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  r, pPg);.    }. 
2a4e0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
2a4f0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
2a500 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2a510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
2a520 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
2a530 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
2a540 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2a550 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2a560 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2a570 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
2a580 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2a590 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2a5a0 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a  r, rc); .}.../*.
2a5b0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
2a5c0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
2a5d0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e   Pager object an
2a5e0 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
2a5f0 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50  to it.** in *ppP
2a600 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20  ager. The pager 
2a610 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c  should eventuall
2a620 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61  y be freed by pa
2a630 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73  ssing it.** to s
2a640 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
2a650 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  ()..**.** The zF
2a660 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
2a670 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20   is the path to 
2a680 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a690 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66  e to open..** If
2a6a0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
2a6b0 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
2a6c0 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
2a6d0 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
2a6e0 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
2a6f0 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
2a700 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61   cached. Tempora
2a710 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20  ry files are be 
2a720 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
2a730 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
2a740 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49  ey are closed. I
2a750 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
2a760 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a  :memory:" then .
2a770 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ** all informati
2a780 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
2a790 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72  che. It is never
2a7a0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2a7b0 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62  . .** This can b
2a7c0 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
2a7d0 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent an in-memory
2a7e0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
2a7f0 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61   The nExtra para
2a800 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20  meter specifies 
2a810 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
2a820 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
2a830 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
2a840 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72  with each page r
2a850 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73  eference. This s
2a860 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
2a870 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a  e to the user.**
2a880 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
2a890 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20  PagerGetExtra() 
2a8a0 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  API..**.** The f
2a8b0 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
2a8c0 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
2a8d0 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
2a8e0 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
2a8f0 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
2a900 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
2a910 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
2a920 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
2a930 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
2a940 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a  GER_* flags..**.
2a950 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
2a960 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
2a970 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
2a980 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
2a990 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
2a9a0 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
2a9b0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
2a9c0 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
2a9d0 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
2a9e0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2a9f0 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
2aa00 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
2aa10 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
2aa20 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
2aa30 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2aa40 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
2aa50 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
2aa60 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
2aa70 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
2aa80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
2aa90 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
2aaa0 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
2aab0 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
2aac0 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2aad0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
2aae0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
2aaf0 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
2ab00 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
2ab10 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
2ab20 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
2ab30 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
2ab40 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
2ab50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2ab60 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
2ab70 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2ab80 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2ab90 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
2aba0 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
2abb0 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
2abc0 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
2abd0 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
2abe0 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2abf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2ac00 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
2ac10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2ac20 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2ac30 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2ac50 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
2ac60 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
2ac70 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2ac80 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2ac90 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2aca0 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
2acb0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
2acc0 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
2acd0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
2ace0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
2acf0 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2ad00 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
2ad10 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
2ad20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
2ad30 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
2ad40 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
2ad50 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
2ad60 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
2ad70 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2ad80 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
2ad90 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
2ada0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2adb0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2adc0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
2add0 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
2ade0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
2adf0 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
2ae00 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
2ae10 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
2ae20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2ae30 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2ae40 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
2ae50 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
2ae60 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
2ae70 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2ae80 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
2ae90 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
2aea0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
2aeb0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2aec0 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
2aed0 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
2aee0 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
2aef0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
2af00 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
2af10 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
2af20 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
2af30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2af40 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
2af50 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
2af60 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
2af70 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
2af80 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
2af90 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
2afa0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
2afb0 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
2afc0 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2afd0 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
2afe0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2aff0 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32   PCache */.  u32
2b000 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2b010 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2b020 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
2b030 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
2b040 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b050 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  Uri = 0;    /* U
2b060 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20  RI args to copy 
2b070 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  */.  int nUri = 
2b080 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
2b090 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2b0a0 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20   of URI args at 
2b0b0 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46  *zUri */..  /* F
2b0c0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
2b0d0 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
2b0e0 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
2b0f0 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2b100 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
2b110 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
2b120 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
2b130 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
2b140 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
2b150 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
2b160 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
2b170 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
2b180 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2b190 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
2b1a0 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
2b1b0 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
2b1c0 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
2b1d0 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
2b1e0 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
2b1f0 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
2b200 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
2b210 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
2b220 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
2b230 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
2b240 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2b250 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2b260 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
2b270 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
2b280 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
2b290 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
2b2a0 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2b2b0 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
2b2c0 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
2b2d0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2b2e0 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2b2f0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2b300 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
2b310 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2b320 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2b330 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
2b340 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
2b350 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
2b360 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
2b370 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
2b380 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
2b390 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  ager = 0;..#ifnd
2b3a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
2b3b0 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c  EMORYDB.  if( fl
2b3c0 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f  ags & PAGER_MEMO
2b3d0 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20  RY ){.    memDb 
2b3e0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  = 1;.    if( zFi
2b3f0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2b400 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ame[0] ){.      
2b410 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2b420 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a  te3DbStrDup(0, z
2b430 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2b440 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2b450 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  0  ) return SQLI
2b460 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2b470 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2b480 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2b490 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46  hname);.      zF
2b4a0 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
2b4b0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2b4c0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
2b4d0 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
2b4e0 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
2b4f0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
2b500 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
2b510 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
2b520 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
2b530 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
2b540 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
2b550 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
2b560 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
2b570 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
2b580 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2b590 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2b5a0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f  ame[0] ){.    co
2b5b0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
2b5c0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
2b5d0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2b5e0 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
2b5f0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2b600 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65  Raw(0, nPathname
2b610 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
2b620 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
2b630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b640 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
2b650 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
2b660 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
2b670 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
2b680 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
2b690 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
2b6a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2b6b0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
2b6c0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
2b6d0 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
2b6e0 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  e);.    nPathnam
2b6f0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2b700 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2b710 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26      z = zUri = &
2b720 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65  zFilename[sqlite
2b730 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
2b740 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ame)+1];.    whi
2b750 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
2b760 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2b770 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20  en30(z)+1;.     
2b780 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2b790 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2b7a0 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e  }.    nUri = (in
2b7b0 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29  t)(&z[1] - zUri)
2b7c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55  ;.    assert( nU
2b7d0 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ri>=0 );.    if(
2b7e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2b7f0 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
2b800 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
2b810 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2b820 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
2b830 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
2b840 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
2b850 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
2b860 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
2b870 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
2b880 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
2b890 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
2b8a0 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
2b8b0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
2b8c0 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
2b8d0 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
2b8e0 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
2b8f0 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
2b900 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2b910 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
2b920 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
2b930 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2b940 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
2b950 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2b960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
2b970 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2b980 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2b990 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b9a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2b9b0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2b9c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b9d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
2b9e0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
2b9f0 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
2ba00 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
2ba10 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
2ba20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
2ba30 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
2ba40 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
2ba50 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
2ba60 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
2ba70 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
2ba80 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
2ba90 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
2baa0 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
2bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bac0 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
2bad0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2bae0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
2baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb00 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
2bb10 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
2bb20 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2bb30 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2bb40 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
2bb50 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
2bb60 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
2bb70 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2bb80 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2bb90 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2bba0 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
2bbb0 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2bbc0 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2bbd0 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2bbe0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2bbf0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2bc00 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2bc10 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
2bc20 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
2bc30 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2bc40 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2bc50 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
2bc60 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
2bc70 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2bc80 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
2bc90 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
2bca0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
2bcb0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
2bcc0 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2bcd0 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
2bce0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
2bcf0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
2bd00 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
2bd10 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
2bd20 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
2bd30 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2bd40 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
2bd50 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
2bd60 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
2bd70 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2bd80 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f  nUri +         /
2bd90 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
2bda0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
2bdb0 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2bdc0 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
2bdd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bde0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e  OMIT_WAL.    + n
2bdf0 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32  Pathname + 4 + 2
2be00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2be10 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  Wal */.#endif.  
2be20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2be30 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2be40 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  T(SQLITE_INT_TO_
2be50 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  PTR(journalFileS
2be60 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21  ize)) );.  if( !
2be70 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pPtr ){.    sqli
2be80 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2be90 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
2bea0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2beb0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
2bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
2bed0 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
2bee0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
2bef0 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
2bf00 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
2bf10 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
2bf20 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
2bf30 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2bf40 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2bf50 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
2bf60 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
2bf70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2bf80 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2bf90 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
2bfa0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
2bfb0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2bfc0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2bfd0 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
2bfe0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
2bff0 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
2c000 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2c010 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
2c020 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2c030 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
2c040 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
2c050 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
2c060 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
2c070 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
2c080 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
2c090 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
2c0a0 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
2c0b0 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29  t( nPathname>0 )
2c0c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  ;.    pPager->zJ
2c0d0 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72  ournal =   (char
2c0e0 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68  *)(pPtr += nPath
2c0f0 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29  name + 1 + nUri)
2c100 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2c110 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2c120 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2c130 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  name);.    if( n
2c140 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50  Uri ) memcpy(&pP
2c150 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2c160 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55  nPathname+1], zU
2c170 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  ri, nUri);.    m
2c180 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
2c190 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ournal, zPathnam
2c1a0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2c1b0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2c1c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2c1d0 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61  hname], "-journa
2c1e0 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20  l\000", 8+2);.  
2c1f0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2c200 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2c210 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2c220 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64  zJournal);.#ifnd
2c230 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2c240 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  AL.    pPager->z
2c250 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  Wal = &pPager->z
2c260 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2c270 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  e+8+1];.    memc
2c280 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  py(pPager->zWal,
2c290 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2c2a0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2c2b0 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c  py(&pPager->zWal
2c2c0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77  [nPathname], "-w
2c2d0 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20  al\000", 4+1);. 
2c2e0 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2c2f0 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2c300 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2c310 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20  >zWal);.#endif. 
2c320 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2c330 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2c340 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
2c350 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
2c360 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
2c370 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
2c380 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
2c390 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2c3a0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2c3b0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2c3c0 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3e0 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
2c3f0 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
2c400 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
2c410 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2c420 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
2c430 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
2c440 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
2c450 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
2c460 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65  !memDb );.    re
2c470 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
2c480 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2c490 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
2c4a0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
2c4b0 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
2c4c0 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
2c4d0 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
2c4e0 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
2c4f0 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
2c500 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
2c510 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
2c520 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2c530 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2c540 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
2c550 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
2c560 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
2c570 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2c580 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
2c590 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
2c5a0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
2c5b0 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
2c5c0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
2c5d0 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
2c5e0 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
2c5f0 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
2c600 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2c610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2c620 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
2c630 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2c640 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
2c650 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
2c660 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2c670 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2c680 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
2c690 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
2c6a0 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
2c6b0 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
2c6c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
2c6d0 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
2c6e0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2c6f0 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
2c700 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2c710 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2c720 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
2c730 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c740 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2c750 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  t = (u32)pPager-
2c760 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
2c770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
2c780 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2c790 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2c7a0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2c7b0 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
2c7c0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2c7d0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2c7e0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
2c7f0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61  nt ii;.        a
2c800 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2c810 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
2c820 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
2c830 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2c840 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
2c850 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
2c860 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2c870 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2c880 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
2c890 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
2c8a0 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
2c8b0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2c8c0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
2c8d0 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
2c8e0 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
2c8f0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
2c900 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
2c910 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2c920 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
2c930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2c940 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2c950 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2c960 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
2c970 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
2c980 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
2c990 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
2c9a0 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
2c9b0 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
2c9c0 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
2c9d0 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
2c9e0 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
2c9f0 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
2ca00 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
2ca10 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
2ca20 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
2ca30 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2ca40 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
2ca50 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2ca60 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
2ca70 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
2ca80 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
2ca90 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
2caa0 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
2cab0 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
2cac0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
2cad0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
2cae0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
2caf0 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
2cb00 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
2cb10 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2cb20 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20  AGER_READER;.   
2cb30 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
2cb40 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
2cb50 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2cb60 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
2cb70 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2cb80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
2cb90 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
2cba0 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
2cbb0 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
2cbc0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
2cbd0 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
2cbe0 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
2cbf0 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
2cc00 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
2cc10 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2cc20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cc30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2cc40 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
2cc50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2cc60 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
2cc70 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
2cc80 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
2cc90 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
2cca0 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
2ccb0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2ccc0 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  rred in either o
2ccd0 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
2cce0 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20  ve, free the .  
2ccf0 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  ** Pager structu
2cd00 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2cd10 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2cd20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cd30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
2cd40 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
2cd50 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
2cd60 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2cd70 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
2cd80 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
2cd90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2cda0 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
2cdb0 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
2cdc0 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ject. */.  asser
2cdd0 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29  t( nExtra<1000 )
2cde0 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55  ;.  nExtra = ROU
2cdf0 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73  ND8(nExtra);.  s
2ce00 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
2ce10 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
2ce20 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
2ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce40 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
2ce50 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
2ce60 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
2ce70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45  PCache);..  PAGE
2ce80 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  RTRACE(("OPEN %d
2ce90 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
2cea0 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
2ceb0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2cec0 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ame));.  IOTRACE
2ced0 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
2cee0 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
2cef0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20  ->zFilename)).. 
2cf00 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2cf10 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75  nal = (u8)useJou
2cf20 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  rnal;.  /* pPage
2cf30 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2cf40 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2cf50 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2cf60 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2cf70 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2cf80 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2cf90 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2cfa0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2cfb0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2cfc0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2cfd0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2cfe0 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2cff0 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2d000 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2d010 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2d020 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  ; */.#if 0.  ass
2d030 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2d040 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
2d050 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
2d060 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
2d070 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ) );.#endif.  /*
2d080 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2d090 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2d0a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
2d0b0 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
2d0c0 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
2d0d0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2d0e0 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
2d0f0 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
2d100 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2d110 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2d120 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2d130 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2d140 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
2d150 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2d160 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
2d170 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
2d180 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2d190 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2d1a0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
2d1b0 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
2d1c0 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
2d1d0 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
2d1e0 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  y;.  assert( use
2d1f0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
2d200 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2d210 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2d220 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2d230 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  le;.  if( pPager
2d240 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2d250 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2d260 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  fullSync==0 );. 
2d270 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d280 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20  r->syncFlags==0 
2d290 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2d2a0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2d2b0 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2d2c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b  sert( pPager->ck
2d2d0 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ptSyncFlags==0 )
2d2e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2d2f0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
2d300 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
2d310 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
2d320 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
2d330 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
2d340 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
2d350 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c  TE_SYNC_NORMAL |
2d360 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41   WAL_SYNC_TRANSA
2d370 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67  CTIONS;.    pPag
2d380 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2d390 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2d3a0 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a  NORMAL;.  }.  /*
2d3b0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
2d3c0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2d3d0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
2d3e0 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
2d3f0 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
2d400 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
2d410 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78  Extra = (u16)nEx
2d420 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
2d430 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
2d440 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2d450 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
2d460 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69  MIT;.  assert( i
2d470 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2d480 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b  ) || tempFile );
2d490 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
2d4a0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
2d4b0 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  !useJournal ){. 
2d4c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2d4d0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2d4e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a  OURNALMODE_OFF;.
2d4f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44    }else if( memD
2d500 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
2d510 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2d520 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2d530 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
2d540 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
2d550 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
2d560 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
2d570 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
2d580 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
2d590 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
2d5a0 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  t;.  /* memset(p
2d5b0 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
2d5c0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
2d5d0 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a  aHash)); */..  *
2d5e0 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
2d5f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2d600 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
2d610 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2d620 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
2d630 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
2d640 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
2d650 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
2d660 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
2d670 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
2d680 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
2d690 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
2d6a0 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
2d6b0 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
2d6c0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
2d6d0 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
2d6e0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2d6f0 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
2d700 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2d710 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
2d720 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
2d730 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2d740 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
2d750 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2d760 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2d770 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
2d780 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
2d790 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
2d7a0 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
2d7b0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2d7c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2d7d0 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
2d7e0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2d7f0 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
2d800 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
2d810 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
2d820 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
2d830 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
2d840 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2d850 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
2d860 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2d870 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
2d880 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2d890 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
2d8a0 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
2d8b0 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
2d8c0 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
2d8d0 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
2d8e0 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
2d8f0 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2d900 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
2d910 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2d920 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
2d930 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
2d940 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
2d950 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
2d960 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
2d970 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2d980 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2d990 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
2d9a0 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
2d9b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2d9c0 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
2d9d0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
2d9e0 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
2d9f0 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
2da00 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
2da10 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
2da20 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2da30 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2da40 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
2da50 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
2da60 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
2da70 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
2da80 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
2da90 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
2daa0 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
2dab0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2dac0 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2dad0 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
2dae0 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
2daf0 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
2db00 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2db10 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
2db20 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
2db30 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
2db40 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2db50 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
2db60 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2db70 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
2db80 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
2db90 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
2dba0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2dbb0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2dbc0 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
2dbd0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2dbe0 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
2dbf0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
2dc00 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
2dc10 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
2dc20 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2dc30 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
2dc40 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
2dc50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2dc60 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
2dc70 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
2dc80 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
2dc90 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2dca0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2dcb0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
2dcc0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2dcd0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2dce0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
2dcf0 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
2dd00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2dd10 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
2dd20 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
2dd30 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
2dd40 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
2dd50 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
2dd60 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2dd70 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
2dd80 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2dd90 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
2dda0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2ddb0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2ddc0 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
2ddd0 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
2dde0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2ddf0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2de00 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
2de10 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
2de20 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
2de30 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
2de40 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
2de50 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
2de60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
2de70 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
2de80 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
2de90 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2dea0 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
2deb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2dec0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
2ded0 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
2dee0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2def0 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
2df00 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2df10 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
2df20 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
2df30 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
2df40 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
2df50 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
2df60 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
2df70 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
2df80 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
2df90 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
2dfa0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
2dfb0 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
2dfc0 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
2dfd0 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2dfe0 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
2dff0 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
2e000 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
2e010 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
2e020 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2e030 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
2e040 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
2e050 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2e060 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
2e070 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
2e080 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
2e090 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
2e0a0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
2e0b0 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
2e0c0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2e0d0 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
2e0e0 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
2e0f0 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
2e100 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
2e110 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
2e120 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2e130 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2e140 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
2e150 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
2e160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e170 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
2e180 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
2e190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e1a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2e1b0 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
2e1c0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
2e1d0 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a  /* Check the siz
2e1e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2e1f0 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f  e file. If it co
2e200 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65  nsists of 0 page
2e210 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  s,.      ** then
2e220 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2e230 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68  nal file. See th
2e240 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
2e250 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20   above for .    
2e260 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69    ** the reasoni
2e270 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65  ng here.  Delete
2e280 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f   the obsolete jo
2e290 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72  urnal file under
2e2a0 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45  .      ** a RESE
2e2b0 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f  RVED lock to avo
2e2c0 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  id race conditio
2e2d0 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20  ns and to avoid 
2e2e0 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  violating.      
2e2f0 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20  ** [H33020]..   
2e300 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2e310 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
2e320 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2e330 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2e340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e350 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
2e360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2e370 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
2e380 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2e390 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
2e3a0 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
2e3b0 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
2e3c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e3d0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
2e3e0 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
2e3f0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
2e400 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2e410 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
2e420 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
2e430 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2e440 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2e450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e460 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
2e470 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2e480 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e490 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
2e4a0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2e4b0 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
2e4c0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
2e4d0 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
2e4e0 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
2e4f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2e500 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
2e510 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
2e520 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
2e530 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
2e540 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
2e550 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2e560 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2e570 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2e580 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
2e590 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
2e5a0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
2e5b0 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
2e5c0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
2e5d0 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
2e5e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e5f0 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2e600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2e610 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
2e620 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
2e630 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2e640 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2e650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2e660 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2e670 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2e680 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
2e690 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2e6a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2e6b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e6c0 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
2e6d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2e6e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2e6f0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
2e700 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
2e710 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
2e720 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2e730 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
2e740 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
2e750 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2e760 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2e770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e780 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2e790 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e7a0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2e7b0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2e7c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e7d0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2e7e0 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
2e7f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2e800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
2e810 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
2e820 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
2e830 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
2e840 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
2e850 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
2e860 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
2e870 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20     ** its has a 
2e880 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
2e890 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
2e8a0 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
2e8b0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
2e8c0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
2e8d0 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
2e8e0 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
2e8f0 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
2e900 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
2e910 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
2e920 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
2e930 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2e940 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
2e950 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2e960 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
2e970 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
2e980 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
2e990 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2e9a0 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
2e9b0 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
2e9c0 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
2e9d0 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
2e9e0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
2e9f0 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
2ea00 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
2ea10 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2ea20 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
2ea30 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
2ea40 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
2ea50 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
2ea60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2ea70 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
2ea80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2ea90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2eaa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2eab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2eac0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2ead0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2eae0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2eaf0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
2eb00 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2eb10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2eb20 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2eb30 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
2eb40 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
2eb50 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
2eb60 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
2eb70 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
2eb80 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
2eb90 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
2eba0 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
2ebb0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2ebc0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2ebd0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2ebe0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
2ebf0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
2ec00 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
2ec10 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2ec20 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
2ec30 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
2ec40 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
2ec50 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
2ec60 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
2ec70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ec80 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
2ec90 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
2eca0 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
2ecb0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
2ecc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ecd0 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
2ece0 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
2ecf0 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
2ed00 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
2ed10 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
2ed20 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
2ed30 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
2ed40 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
2ed50 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
2ed60 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
2ed70 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
2ed80 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
2ed90 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
2eda0 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
2edb0 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
2edc0 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
2edd0 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
2ede0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2edf0 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
2ee00 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
2ee10 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
2ee20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
2ee30 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
2ee40 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2ee50 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2ee60 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
2ee70 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
2ee80 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
2ee90 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2eea0 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
2eeb0 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
2eec0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
2eed0 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
2eee0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2eef0 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
2ef00 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
2ef10 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
2ef20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2ef30 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
2ef40 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
2ef50 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
2ef60 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
2ef70 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2ef80 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
2ef90 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2efa0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2efb0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
2efc0 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
2efd0 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
2efe0 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
2eff0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
2f000 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
2f010 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
2f020 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2f030 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2f040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2f050 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
2f060 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2f070 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f080 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2f090 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2f0a0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
2f0b0 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
2f0c0 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
2f0d0 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
2f0e0 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
2f0f0 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
2f100 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
2f110 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
2f120 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
2f130 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
2f140 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
2f150 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
2f160 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
2f170 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
2f180 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
2f190 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f  ccess mode..  */
2f1a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2f1b0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2f1c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2f1d0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
2f1e0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2f1f0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2f200 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f210 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2f220 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
2f230 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
2f240 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45  ADER );.  if( NE
2f250 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
2f260 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
2f270 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2f280 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66  errCode; }..  if
2f290 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
2f2a0 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
2f2b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2f2c0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
2f2d0 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
2f2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f2f0 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
2f300 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
2f310 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
2f320 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
2f330 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2f340 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
2f350 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2f360 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2f370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f390 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
2f3a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
2f3b0 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
2f3c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  ;.      goto fai
2f3d0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
2f3e0 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
2f3f0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
2f400 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
2f410 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
2f420 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2f430 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
2f440 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
2f450 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
2f460 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
2f470 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
2f480 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
2f490 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
2f4a0 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
2f4b0 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
2f4c0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
2f4d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f4e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
2f4f0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
2f500 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
2f510 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
2f520 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
2f530 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
2f540 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
2f550 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  Y_ROLLBACK;.    
2f560 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2f570 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2f580 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
2f590 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
2f5a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
2f5b0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
2f5c0 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
2f5d0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
2f5e0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
2f5f0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
2f600 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
2f610 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
2f620 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
2f630 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
2f640 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
2f650 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
2f660 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
2f670 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2f680 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
2f690 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
2f6a0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
2f6b0 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
2f6c0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
2f6d0 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
2f6e0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
2f6f0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
2f700 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
2f710 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
2f720 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
2f730 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
2f740 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
2f750 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
2f760 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
2f770 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
2f780 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
2f790 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
2f7a0 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
2f7b0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
2f7c0 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
2f7d0 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
2f7e0 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
2f7f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f800 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
2f810 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
2f820 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
2f830 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
2f840 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
2f850 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
2f860 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
2f870 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
2f880 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2f890 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
2f8a0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2f8b0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
2f8c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
2f8d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f8e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f8f0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2f900 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
2f910 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
2f920 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
2f930 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
2f940 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
2f950 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
2f960 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
2f970 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
2f980 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
2f990 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
2f9a0 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
2f9b0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
2f9c0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2f9d0 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
2f9e0 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
2f9f0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
2fa00 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
2fa10 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
2fa20 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
2fa30 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
2fa40 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
2fa50 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
2fa60 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
2fa70 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
2fa80 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
2fa90 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
2faa0 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
2fab0 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
2fac0 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
2fad0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
2fae0 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
2faf0 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
2fb00 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
2fb10 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
2fb20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
2fb30 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
2fb40 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
2fb50 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
2fb60 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
2fb70 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
2fb80 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
2fb90 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
2fba0 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
2fbb0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
2fbc0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
2fbd0 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
2fbe0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
2fbf0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
2fc00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
2fc10 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
2fc20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2fc30 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2fc40 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
2fc50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
2fc60 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
2fc70 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
2fc80 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
2fc90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2fca0 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
2fcb0 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
2fcc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fcd0 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
2fce0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
2fcf0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2fd00 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2fd10 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
2fd20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2fd30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
2fd40 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
2fd50 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
2fd60 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
2fd70 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2fd80 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
2fd90 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2fda0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
2fdb0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
2fdc0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
2fdd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fde0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2fdf0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
2fe00 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
2fe10 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
2fe20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2fe30 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
2fe40 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2fe50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2fe60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2fe70 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2fe80 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
2fe90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2fea0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2feb0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2fec0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2fed0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2fee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fef0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20   }.      }. .   
2ff00 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
2ff10 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
2ff20 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
2ff30 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
2ff40 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
2ff50 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
2ff60 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
2ff70 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
2ff80 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
2ff90 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
2ffa0 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
2ffb0 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
2ffc0 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
2ffd0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
2ffe0 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
2fff0 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
30000 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
30010 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
30020 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
30030 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
30040 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
30050 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
30060 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
30070 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
30080 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
30090 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
300a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
300b0 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
300c0 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
300d0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
300e0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
300f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
30100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
30110 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
30120 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
30130 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
30140 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30150 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30160 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
30170 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
30180 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
30190 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
301a0 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  R_OPEN;.        
301b0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
301c0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
301d0 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
301e0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
301f0 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
30200 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
30210 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
30220 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30230 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
30240 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
30250 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
30260 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f  hile trying to o
30270 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
30280 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f  r roll back a ho
30290 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20  t-journal while 
302a0 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
302b0 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
302c0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
302d0 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  unlock() routine
302e0 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
302f0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
30300 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20   to unlock.     
30310 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20     ** the file. 
30320 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74  If the unlock at
30330 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65  tempt fails, the
30340 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75  n Pager.eLock mu
30350 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
30360 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
30370 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f  LOCK (see the co
30380 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
30390 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20  #define for .   
303a0 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f       ** UNKNOWN_
303b0 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61  LOCK above for a
303c0 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20  n explanation). 
303d0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
303e0 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
303f0 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c  to get pager_unl
30400 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73  ock() to do this
30410 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61  , set Pager.eSta
30420 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  te to.        **
30430 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77   PAGER_ERROR now
30440 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
30450 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61  tually counted a
30460 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20  s a transition. 
30470 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52         ** to ERR
30480 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20  OR state in the 
30490 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74  state diagram at
304a0 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
304b0 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a   file,.        *
304c0 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
304d0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61  that the same ca
304e0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
304f0 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20  ck() will very. 
30500 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c         ** shortl
30510 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65  y transition the
30520 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   pager object to
30530 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
30540 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   Calling.       
30550 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72   ** assert_pager
30560 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66  _state() would f
30570 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73  ail now, as it s
30580 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73  hould not be pos
30590 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
305a0 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20   to be in ERROR 
305b0 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65  state when there
305c0 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61   are zero outsta
305d0 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20  nding page .    
305e0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
305f0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
30600 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
30610 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
30620 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
30630 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
30640 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30650 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
30660 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61  _OPEN );.      a
30670 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
30680 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
30690 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
306a0 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
306b0 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
306c0 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
306d0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
306e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
306f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
30700 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
30710 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71  r->pBackup || sq
30720 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
30730 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
30740 61 63 68 65 29 3e 30 29 20 0a 20 20 20 20 29 7b  ache)>0) .    ){
30750 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
30760 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
30770 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
30780 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30790 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
307a0 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
307b0 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
307c0 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
307d0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a  previous.      *
307e0 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
307f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43  transaction).  C
30800 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
30810 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
30820 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
30830 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
30840 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
30850 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
30860 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
30870 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
30880 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
30890 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
308a0 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
308b0 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
308c0 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
308d0 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
308e0 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
308f0 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
30900 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  tes are.      **
30910 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
30920 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
30930 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
30940 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
30950 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
30960 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
30970 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
30980 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
30990 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
309a0 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a   in use..      *
309b0 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  * .      ** Ther
309c0 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
309d0 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
309e0 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
309f0 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
30a00 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
30a10 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
30a20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
30a30 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
30a40 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  at.      ** it c
30a50 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
30a60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30a70 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a  Pgno nPage = 0;.
30a80 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
30a90 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
30aa0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
30ab0 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70  ];..      rc = p
30ac0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
30ad0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
30ae0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
30af0 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20  to failed;..    
30b00 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
30b10 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
30b20 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
30b30 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
30b40 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
30b50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
30b60 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
30b70 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
30b80 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
30b90 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
30ba0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
30bb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30bc0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
30bd0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
30be0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30bf0 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
30c00 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
30c10 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
30c20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
30c30 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
30c40 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
30c50 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
30c60 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
30c70 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
30c80 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
30c90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
30ca0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
30cb0 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68  a WAL file in th
30cc0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f  e file-system, o
30cd0 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73  pen this databas
30ce0 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20  e in WAL.    ** 
30cf0 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  mode. Otherwise,
30d00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
30d10 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20  unction call is 
30d20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a  a no-op..    */.
30d30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
30d40 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70  enWalIfPresent(p
30d50 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20  Pager);.#ifndef 
30d60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
30d70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30d80 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72  er->pWal==0 || r
30d90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
30da0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
30db0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
30dc0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
30dd0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
30de0 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
30df0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
30e00 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
30e10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
30e20 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30e30 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53  ER_OPEN && rc==S
30e40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30e50 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
30e60 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61  unt(pPager, &pPa
30e70 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
30e80 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
30e90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30ea0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
30eb0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67  MEMDB );.    pag
30ec0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
30ed0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
30ee0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
30ef0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d  AGER_OPEN );.  }
30f00 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
30f10 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
30f20 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72  _READER;.  }.  r
30f30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
30f40 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
30f50 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
30f60 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c  ached zero, roll
30f70 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a  back any active.
30f80 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
30f90 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  nd unlock the pa
30fa0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  ger..**.** Excep
30fb0 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  t, in locking_mo
30fc0 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65  de=EXCLUSIVE whe
30fd0 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  n there is nothi
30fe0 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20  ng to in.** the 
30ff0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
31000 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20  , the unlock is 
31010 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e  not performed an
31020 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  d there is.** no
31030 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  thing to rollbac
31040 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  k, so this routi
31050 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
31060 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  / .static void p
31070 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
31080 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
31090 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65  ){.  if( (sqlite
310a0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
310b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
310c0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65  ==0) ){.    page
310d0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
310e0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
310f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
31100 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
31110 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
31120 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72   in pager pPager
31130 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65   (a page.** refe
31140 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44  rence has type D
31150 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20  bPage*). If the 
31160 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65  requested refere
31170 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  nce is .** succe
31180 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
31190 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  , it is copied t
311a0 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51  o *ppPage and SQ
311b0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
311c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
311d0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
311e0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
311f0 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74  cache, it is ret
31200 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
31210 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65  wise, a new page
31220 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
31230 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
31240 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20  ed with data.** 
31250 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
31260 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
31270 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
31280 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61  pcache module ma
31290 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20  y.** choose not 
312a0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
312b0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e  w page object an
312c0 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65  d may reuse an e
312d0 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63  xisting.** objec
312e0 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61  t with no outsta
312f0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
31300 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72  ..**.** The extr
31310 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
31320 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
31330 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
31340 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a  to zeros the .**
31350 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
31360 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
31370 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65  o memory. If the
31380 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20   page requested 
31390 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  is .** already i
313a0 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  n the cache when
313b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
313c0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
313d0 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61  he extra.** data
313e0 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77   is left as it w
313f0 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  as when the page
31400 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74   object was last
31410 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
31420 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
31430 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ge is smaller th
31440 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
31450 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a   page or if a .*
31460 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
31470 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
31480 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61  e noContent para
31490 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a  meter and the .*
314a0 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  * requested page
314b0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
314c0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61  stored in the ca
314d0 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a  che, then no .**
314e0 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61   actual disk rea
314f0 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69  d occurs. In thi
31500 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  s case the memor
31510 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a  y image of the .
31520 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  ** page is initi
31530 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65  alized to all ze
31540 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ros. .**.** If n
31550 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
31560 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
31570 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
31580 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
31590 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
315a0 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e  . This occurs in
315b0 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63   two seperate sc
315c0 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
315d0 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67   a) When reading
315e0 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
315f0 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  f page from the 
31600 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a  database, and.**
31610 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20  .**   b) When a 
31620 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69  savepoint is bei
31630 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  ng rolled back a
31640 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f  nd we need to lo
31650 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77  ad.**      a new
31660 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63   page into the c
31670 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65  ache to be fille
31680 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  d with the data 
31690 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
316a0 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  m the savepoint 
316b0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
316c0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
316d0 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
316e0 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
316f0 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66  eroed instead of
31700 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66  .** being read f
31710 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
31720 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
31730 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
31740 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
31750 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
31760 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
31770 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
31780 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
31790 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
317a0 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
317b0 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
317c0 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
317d0 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
317e0 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
317f0 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
31800 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
31810 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
31820 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
31830 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
31840 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
31850 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
31860 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
31870 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
31880 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
31890 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
318a0 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
318b0 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
318c0 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
318d0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
318e0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
318f0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
31900 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
31910 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
31920 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
31930 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
31940 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
31950 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
31960 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
31970 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
31980 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
31990 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
319a0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
319b0 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
319c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
319d0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
319e0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
319f0 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
31a00 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
31a10 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
31a20 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
31a30 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
31a40 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
31a50 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
31a60 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
31a70 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
31a80 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
31a90 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
31aa0 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
31ab0 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
31ac0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
31ad0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
31ae0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
31af0 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
31b00 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
31b10 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
31b20 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
31b30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31b40 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
31b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
31b60 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
31b70 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
31b80 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
31b90 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
31ba0 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
31bb0 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
31bc0 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
31bd0 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
31be0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
31bf0 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
31c00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
31c10 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
31c20 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
31c30 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
31c40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
31c50 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
31c60 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
31c70 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
31c80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31c90 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
31ca0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
31cb0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
31cc0 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
31cd0 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65  rn an error imme
31ce0 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f  diately. .  ** O
31cf0 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73  therwise, reques
31d00 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  t the page from 
31d10 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72  the PCache layer
31d20 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
31d30 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
31d40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
31d50 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
31d60 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
31d70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
31d80 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
31d90 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31  pPCache, pgno, 1
31da0 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  , ppPage);.  }..
31db0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31dc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  _OK ){.    /* Ei
31dd0 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f  ther the call to
31de0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
31df0 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61  tch() returned a
31e00 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20  n error or the. 
31e10 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20     ** pager was 
31e20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
31e30 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
31e40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
31e50 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
31e60 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e   Set pPg to 0 an
31e70 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78  d jump to the ex
31e80 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e  ception handler.
31e90 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30    */.    pPg = 0
31ea0 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72  ;.    goto pager
31eb0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
31ec0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
31ed0 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
31ee0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
31ef0 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
31f00 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70  ==pPager || (*pp
31f10 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30  Page)->pPager==0
31f20 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50   );..  if( (*ppP
31f30 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20  age)->pPager && 
31f40 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  !noContent ){.  
31f50 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
31f60 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72  e the pcache alr
31f70 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  eady contains an
31f80 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70   initialized cop
31f90 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  y of.    ** the 
31fa0 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74  page. Return wit
31fb0 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f  hout further ado
31fc0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
31fd0 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41  ( pgno<=PAGER_MA
31fe0 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d  X_PGNO && pgno!=
31ff0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
32000 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61  ager) );.    pPa
32010 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
32020 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20  _STAT_HIT]++;.  
32030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32040 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
32050 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
32060 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
32070 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
32080 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
32090 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
320a0 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20  tialized.  */.. 
320b0 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
320c0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
320d0 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
320e0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
320f0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
32100 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
32110 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
32120 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
32130 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
32140 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
32150 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
32160 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
32170 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
32180 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
32190 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
321a0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
321b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
321c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
321d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
321e0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
321f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45     }..    if( ME
32200 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  MDB || pPager->d
32210 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f  bSize<pgno || no
32220 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70  Content || !isOp
32230 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
32240 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
32250 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
32260 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
32270 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
32280 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
32290 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
322a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
322b0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
322c0 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
322d0 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
322e0 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
322f0 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
32300 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
32310 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
32320 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
32330 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
32340 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
32350 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
32360 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
32370 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
32380 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
32390 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
323a0 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
323b0 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
323c0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
323d0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
323e0 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
323f0 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
32400 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
32410 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
32420 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
32430 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
32440 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
32450 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
32460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
32470 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
32480 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
32490 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
324a0 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
324b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
324c0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
324d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
324e0 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
324f0 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
32500 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
32510 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
32520 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
32530 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
32540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
32550 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
32560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32570 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
32580 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
32590 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49  geSize);.      I
325a0 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
325b0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
325c0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
325d0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
325e0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
325f0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
32600 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
32610 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
32620 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
32630 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
32640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32650 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
32660 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
32670 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
32680 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
32690 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
326a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
326b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
326c0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20  r_acquire_err:. 
326d0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
326e0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
326f0 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pPg ){.    sqlit
32700 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
32710 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
32720 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
32730 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65  ger);..  *ppPage
32740 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
32750 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
32760 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
32770 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
32780 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
32790 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
327a0 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
327b0 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
327c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
327d0 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
327e0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
327f0 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a  t in cache. .**.
32800 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
32810 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
32820 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
32830 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
32840 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
32850 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
32860 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
32870 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
32880 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
32890 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
328a0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
328b0 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
328c0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
328d0 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
328e0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
328f0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
32900 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
32910 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
32920 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
32930 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
32940 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
32950 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
32960 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
32970 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32980 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
32990 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
329a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
329b0 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73  Cache!=0 );.  as
329c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
329d0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
329e0 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
329f0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
32a00 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  R );.  sqlite3Pc
32a10 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
32a20 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
32a30 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74   0, &pPg);.  ret
32a40 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pPg;.}../*.*
32a50 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
32a60 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a   reference..**.*
32a70 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
32a80 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
32a90 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
32aa0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
32ab0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
32ac0 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
32ad0 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
32ae0 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
32af0 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
32b00 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
32b10 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
32b20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
32b30 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
32b40 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
32b50 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
32b60 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
32b70 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67  ( pPg ){.    Pag
32b80 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
32b90 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71  ->pPager;.    sq
32ba0 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
32bb0 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67  se(pPg);.    pag
32bc0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
32bd0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
32be0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
32bf0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
32c00 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
32c10 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
32c20 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
32c30 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
32c40 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
32c50 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
32c60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
32c70 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
32c80 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
32c90 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
32ca0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
32cb0 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
32cc0 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
32cd0 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
32ce0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
32cf0 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
32d00 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
32d10 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
32d20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
32d30 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
32d40 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
32d50 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
32d60 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
32d70 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
32d80 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
32d90 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
32da0 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
32db0 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
32dc0 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
32dd0 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
32de0 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
32df0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32e00 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
32e10 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
32e20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
32e30 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
32e40 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
32e50 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
32e60 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
32e70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
32e80 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
32e90 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
32ea0 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
32eb0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
32ec0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
32ed0 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
32ee0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
32ef0 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
32f00 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
32f10 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
32f20 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
32f30 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
32f40 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
32f50 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
32f60 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
32f70 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
32f80 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
32f90 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
32fa0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
32fb0 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
32fc0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
32fd0 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
32fe0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
32ff0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
33000 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
33010 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33030 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
33040 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
33050 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
33060 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
33070 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
33080 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
33090 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
330a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
330b0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
330c0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
330d0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
330e0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
330f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
33100 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
33110 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
33120 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
33130 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
33140 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
33150 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
33160 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
33170 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
33180 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
33190 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
331a0 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
331b0 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
331c0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
331d0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
331e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
331f0 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  ode;..  if( !pag
33200 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
33210 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
33220 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
33230 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
33240 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  {.    pPager->pI
33250 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
33260 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
33270 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
33280 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
33290 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
332a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
332b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
332c0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
332d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
332e0 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
332f0 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
33300 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
33310 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
33320 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
33330 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
33340 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
33350 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
33360 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
33370 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
33380 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
33390 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  se{.        cons
333a0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
333b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333c0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
333d0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
333e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53  e */.          S
333f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
33400 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
33410 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
33420 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
33430 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
33440 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
33450 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
33460 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
33470 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
33480 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
33490 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
334a0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
334b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
334c0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
334d0 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  E.        rc = s
334e0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
334f0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  n(.            p
33500 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
33510 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
33520 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
33530 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
33540 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23  ).        );.  #
33550 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20  else.        rc 
33560 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
33570 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
33580 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
33590 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
335a0 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d    #endif.      }
335b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
335c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
335d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
335e0 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  fd) );.    }.  .
335f0 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
33600 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
33610 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
33620 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
33630 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   open .    ** th
33640 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
33650 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
33660 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
33670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33680 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
33690 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
336a0 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
336b0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ired. */.      p
336c0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
336d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
336e0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
336f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
33700 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
33710 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
33720 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  lHdr = 0;.      
33730 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
33740 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
33750 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
33760 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33770 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
33780 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
33790 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
337a0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
337b0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rnal = 0;.  }els
337c0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
337d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
337e0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
337f0 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ED );.    pPager
33800 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
33810 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
33820 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
33830 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
33840 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
33850 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
33860 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
33870 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
33880 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
33890 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
338a0 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
338b0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
338c0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
338d0 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
338e0 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
338f0 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
33900 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c   a RESERVED.** l
33910 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
33920 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46  ase file. If exF
33930 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
33940 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
33950 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49  st.** an EXCLUSI
33960 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68  VE lock. If such
33970 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61   a lock is alrea
33980 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b  dy held, no lock
33990 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ing .** function
339a0 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64  s need be called
339b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
339c0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
339d0 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
339e0 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a  , then any sub-j
339f0 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a  ournal opened.**
33a00 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
33a10 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
33a20 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
33a30 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68  -memory file. Th
33a40 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66  is.** has no eff
33a50 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a  ect if the sub-j
33a60 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64  ournal is alread
33a70 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20  y opened (as it 
33a80 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72  may be when.** r
33a90 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
33aa0 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20  ive mode) or if 
33ab0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
33ac0 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
33ad0 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61   a.** sub-journa
33ae0 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  l. If the subjIn
33af0 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
33b00 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  is zero, then an
33b10 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75  y required.** su
33b20 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70  b-journal is imp
33b30 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f  lemented in-memo
33b40 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20  ry if pPager is 
33b50 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
33b60 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73  abase, .** or us
33b70 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ing a temporary 
33b80 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  file otherwise..
33b90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
33ba0 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a  gerBegin(Pager *
33bb0 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c  pPager, int exFl
33bc0 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65  ag, int subjInMe
33bd0 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20  mory){.  int rc 
33be0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
33bf0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
33c00 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61  ode ) return pPa
33c10 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
33c20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33c30 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
33c40 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e  ADER && pPager->
33c50 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52  eState<PAGER_ERR
33c60 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OR );.  pPager->
33c70 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28  subjInMemory = (
33c80 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8)subjInMemory;
33c90 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ..  if( ALWAYS(p
33ca0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33cb0 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a  AGER_READER) ){.
33cc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
33cd0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
33ce0 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  0 );..    if( pa
33cf0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
33d00 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
33d10 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f   the pager is co
33d20 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
33d30 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
33d40 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20  lusive, and an. 
33d50 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
33d60 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
33d70 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c  tabase is not al
33d80 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61  ready held, obta
33d90 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20  in it now..     
33da0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
33db0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
33dc0 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61  ode && sqlite3Wa
33dd0 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
33de0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29  Pager->pWal, -1)
33df0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
33e00 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
33e10 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
33e20 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
33e30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
33e50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
33e60 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
33e70 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
33e80 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
33e90 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
33ea0 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
33eb0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
33ec0 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
33ed0 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
33ee0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
33ef0 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
33f00 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
33f10 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
33f20 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
33f30 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
33f40 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
33f50 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
33f60 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
33f70 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
33f80 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
33f90 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
33fa0 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
33fb0 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
33fc0 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
33fd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
33fe0 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
33ff0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
34000 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
34010 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
34020 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
34030 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
34040 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
34050 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
34060 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
34070 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
34080 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
34090 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
340a0 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
340b0 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
340c0 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
340d0 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
340e0 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
340f0 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
34100 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
34110 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
34120 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
34130 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
34140 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
34150 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
34160 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
34170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
34180 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
34190 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
341a0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
341b0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
341c0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
341d0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
341e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
341f0 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57    /* Change to W
34200 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
34210 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
34220 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
34230 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65  ets Pager.eState
34240 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52   to PAGER_WRITER
34250 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45  _LOCKED or CACHE
34260 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  MOD.      ** whe
34270 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e  n it has an open
34280 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
34290 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44  t never to DBMOD
342a0 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20   or FINISHED..  
342b0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
342c0 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20  ecause in those 
342d0 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  states the code 
342e0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
342f0 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
34300 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61   transactions ma
34310 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  y copy data from
34320 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
34330 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
34340 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  se .      ** fil
34350 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74  e as well as int
34360 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
34370 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
34380 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20   incorrect in . 
34390 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
343a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
343b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
343c0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  = PAGER_WRITER_L
343d0 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61  OCKED;.      pPa
343e0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
343f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
34400 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
34410 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61  dbFileSize = pPa
34420 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
34430 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
34440 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
34450 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
34460 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
34470 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
34480 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
34490 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
344a0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
344b0 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73  READER );.    as
344c0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
344d0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
344e0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
344f0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
34500 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
34510 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
34520 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50  ger) );.  }..  P
34530 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
34540 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
34550 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
34560 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
34570 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
34580 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20  ingle data page 
34590 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
345a0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
345b0 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d  n into the .** m
345c0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  ain journal or s
345d0 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65  ub-journal as re
345e0 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70  quired. If the p
345f0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
34600 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  nto.** one of th
34610 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20  e journals, the 
34620 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
34630 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  t is set in the 
34640 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
34650 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20  rnal bitvec and 
34660 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
34670 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
34680 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e  bitvecs.** of an
34690 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  y open savepoint
346a0 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  s as appropriate
346b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
346c0 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
346d0 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
346e0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
346f0 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
34700 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
34710 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
34720 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
34730 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
34740 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73  not called unles
34750 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
34760 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
34770 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61  y .  ** been sta
34780 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61  rted. The journa
34790 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  l file may or ma
347a0 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74  y not be open at
347b0 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
347c0 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61  * It is never ca
347d0 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f  lled in the ERRO
347e0 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  R state..  */.  
347f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34800 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
34810 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
34820 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
34830 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
34840 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
34850 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
34860 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
34870 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
34880 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
34890 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
348a0 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  r) );..  /* If a
348b0 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  n error has been
348c0 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65   previously dete
348d0 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65  cted, report the
348e0 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a   same error.  **
348f0 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f   again. This sho
34900 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20  uld not happen, 
34910 62 75 74 20 74 68 65 20 63 68 65 63 6b 20 70 72  but the check pr
34920 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73  ovides robustnes
34930 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
34940 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
34950 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61  e) )  return pPa
34960 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
34970 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c   /* Higher-level
34980 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20   routines never 
34990 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
349a0 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69  on if database i
349b0 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61  s not.  ** writa
349c0 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20  ble.  But check 
349d0 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72  anyway, just for
349e0 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a   robustness. */.
349f0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
34a00 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20  er->readOnly) ) 
34a10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
34a20 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  RM;..  CHECK_PAG
34a30 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68  E(pPg);..  /* Th
34a40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
34a50 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65  eeds to be opene
34a60 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20  d. Higher level 
34a70 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c  routines have al
34a80 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69  ready.  ** obtai
34a90 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  ned the necessar
34aa0 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e  y locks to begin
34ab0 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
34ac0 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a  action, but the.
34ad0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f    ** rollback jo
34ae0 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
34af0 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65  yet be open. Ope
34b00 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73  n it now if this
34b10 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
34b20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
34b30 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  done before call
34b40 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
34b50 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20  eMakeDirty() on 
34b60 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20  the page. .  ** 
34b70 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74  Otherwise, if it
34b80 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72   were done after
34b90 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
34ba0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
34bb0 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20  ), then.  ** an 
34bc0 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75  error might occu
34bd0 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  r and the pager 
34be0 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20  would end up in 
34bf0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
34c00 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61  ate.  ** with pa
34c10 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69  ges marked as di
34c20 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  rty in the cache
34c30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
34c40 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
34c50 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
34c60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
34c70 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
34c80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
34c90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
34cb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34cc0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
34cd0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
34ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
34cf0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
34d00 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
34d10 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
34d20 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
34d30 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
34d40 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
34d50 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
34d60 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
34d70 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
34d80 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
34d90 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
34da0 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65  pPg);.  if( page
34db0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
34dc0 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  & !subjRequiresP
34dd0 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
34de0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
34df0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
34e00 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
34e10 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
34e20 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
34e30 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
34e40 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
34e50 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
34e60 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
34e70 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
34e80 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
34e90 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
34ea0 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
34eb0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
34ec0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
34ed0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
34ee0 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
34ef0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
34f00 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
34f10 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
34f20 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
34f30 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
34f40 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
34f50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
34f60 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65  rigSize && isOpe
34f70 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
34f80 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
34f90 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
34fa0 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20  r *pData2;.     
34fb0 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50     i64 iOff = pP
34fc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
34fd0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
34fe0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
34ff0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
35000 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
35010 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
35020 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
35030 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
35040 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
35050 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
35060 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
35070 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
35080 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
35090 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
350a0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
350b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
350c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
350d0 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
350e0 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20  nalOff );.      
350f0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
35100 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
35110 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
35120 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
35130 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
35140 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
35150 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
35160 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ta2);..        /
35170 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
35180 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
35190 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a  r occurs while j
351a0 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
351b0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
351c0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
351d0 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
351e0 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
351f0 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
35200 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
35210 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
35220 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
35230 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
35240 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
35250 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
35260 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
35270 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
35280 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
35290 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
352a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
352b0 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
352c0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
352d0 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
352e0 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
352f0 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
35300 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35310 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
35320 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
35330 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ..        rc = w
35340 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
35350 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50  r->jfd, iOff, pP
35360 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
35370 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35380 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
35390 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
353a0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
353b0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
353c0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
353d0 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20  ze, iOff+4);.   
353e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
353f0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
35400 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
35410 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
35420 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70  ger->jfd, iOff+p
35430 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
35440 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  4, cksum);.     
35450 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35460 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
35470 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ;..        IOTRA
35480 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
35490 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
354a0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
354b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
354d0 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
354e0 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
354f0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
35500 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
35510 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
35520 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
35530 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
35540 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
35550 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
35560 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
35570 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
35580 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
35590 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
355a0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
355b0 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
355c0 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
355d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
355e0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b  ournalOff += 8 +
355f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
35600 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e;.        pPage
35610 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
35620 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
35630 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
35640 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
35650 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
35660 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
35670 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
35680 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
35690 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
356a0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
356b0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
356c0 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
356d0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
356e0 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f       rc |= addTo
356f0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
35700 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
35710 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
35720 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
35730 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
35740 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
35750 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
35760 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
35770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
35780 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
35790 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
357a0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
357b0 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OD ){.          
357c0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
357d0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
357e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
357f0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50   PAGERTRACE(("AP
35800 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
35810 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
35820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35830 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
35840 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
35850 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
35860 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
35870 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b  ED_SYNC)?1:0)));
35880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35890 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
358a0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
358b0 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
358c0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
358d0 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
358e0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
358f0 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
35900 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
35910 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
35920 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
35930 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
35940 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
35950 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
35960 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
35970 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
35980 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
35990 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
359a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
359b0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
359c0 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pPg) ){.      rc
359d0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
359e0 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
359f0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
35a00 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
35a10 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
35a20 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
35a30 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
35a40 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
35a50 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
35a60 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
35a70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
35a80 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
35a90 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69  s writeable. Thi
35aa0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
35ab0 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
35ac0 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  .** making chang
35ad0 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68  es to a page. Th
35ae0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68  e caller must ch
35af0 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
35b00 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73  alue .** of this
35b10 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65   function and be
35b20 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20   careful not to 
35b30 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
35b40 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20  data unless .** 
35b50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
35b60 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
35b70 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
35b80 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
35b90 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
35ba0 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
35bb0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
35bc0 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
35bd0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
35be0 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
35bf0 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
35c00 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
35c10 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
35c20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
35c30 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
35c40 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
35c50 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
35c60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
35c70 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
35c80 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
35c90 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
35ca0 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
35cb0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
35cc0 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70  turned.** as app
35cd0 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77  ropriate. Otherw
35ce0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
35cf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
35d00 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
35d10 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
35d20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35d30 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
35d40 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
35d50 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
35d60 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
35d70 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
35d80 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
35d90 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
35da0 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72  eSize);..  asser
35db0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
35dc0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
35dd0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
35de0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
35df0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
35e00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
35e10 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
35e20 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
35e30 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ( nPagePerSector
35e40 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
35e50 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
35e60 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
35e70 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
35e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
35e90 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
35ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35eb0 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
35ec0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
35ed0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
35ee0 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  .    int nPage =
35ef0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
35f00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
35f10 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
35f20 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
35f30 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
35f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35f50 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
35f60 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
35f70 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  c = 0;         /
35f80 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
35f90 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45  ge has PGHDR_NEE
35fa0 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f  D_SYNC */..    /
35fb0 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
35fc0 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f  yncSpill flag to
35fd0 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
35fe0 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
35ff0 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75  low.    ** a jou
36000 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62  rnal header to b
36010 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
36020 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
36030 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  naled by.    ** 
36040 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  this function.. 
36050 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
36060 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
36070 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36080 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d  doNotSyncSpill==
36090 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
360a0 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b  >doNotSyncSpill+
360b0 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  +;..    /* This 
360c0 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
360d0 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
360e0 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
360f0 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a  -size are.    **
36100 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
36110 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
36120 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
36130 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
36140 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
36150 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
36160 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
36170 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ated on..    */.
36180 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d      pg1 = ((pPg-
36190 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61  >pgno-1) & ~(nPa
361a0 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20  gePerSector-1)) 
361b0 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43  + 1;..    nPageC
361c0 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64  ount = pPager->d
361d0 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70  bSize;.    if( p
361e0 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
361f0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
36200 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
36210 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
36220 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
36230 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
36240 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
36250 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
36260 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
36270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
36280 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
36290 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
362a0 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
362b0 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
362c0 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
362d0 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
362e0 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
362f0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
36300 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
36310 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
36320 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
36330 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
36340 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
36350 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
36360 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
36370 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
36380 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
36390 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g) ){.        if
363a0 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
363b0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
363c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
363d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
363e0 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
363f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
36400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36410 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
36420 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
36430 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
36440 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
36450 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
36460 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
36470 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
36480 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
36490 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
364a0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
364b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
364c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
364d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50     }else if( (pP
364e0 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
364f0 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21  up(pPager, pg))!
36500 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
36510 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
36520 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
36530 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
36540 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
36550 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
36560 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
36570 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
36580 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
36590 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
365a0 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66  NC flag is set f
365b0 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50  or any of the nP
365c0 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
365d0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  * starting at pg
365e0 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73  1, then it needs
365f0 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61   to be set for a
36600 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61  ll of them. Beca
36610 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69  use.    ** writi
36620 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ng to any of the
36630 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d  se nPage pages m
36640 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74  ay damage the ot
36650 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a  hers, the.    **
36660 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
36670 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28  st contain sync(
36680 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c  )ed copies of al
36690 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  l of them.    **
366a0 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74   before any of t
366b0 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74  hem can be writt
366c0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
366d0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
366e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
366f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65  SQLITE_OK && nee
36700 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61  dSync ){.      a
36710 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
36720 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
36730 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29   ii<nPage; ii++)
36740 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  {.        PgHdr 
36750 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  *pPage = pager_l
36760 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
36770 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69  1+ii);.        i
36780 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
36790 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61        pPage->fla
367a0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
367b0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
367c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
367d0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
367e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
367f0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
36800 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
36810 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20  cSpill==1 );.   
36820 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
36830 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c  ncSpill--;.  }el
36840 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
36850 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
36860 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
36870 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
36880 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
36890 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
368a0 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
368b0 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
368c0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
368d0 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
368e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
368f0 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
36900 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
36910 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
36920 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
36930 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
36940 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
36950 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
36960 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
36970 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
36980 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66  _DIRTY;.}.#endif
36990 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
369a0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
369b0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
369c0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
369d0 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
369e0 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
369f0 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ion on page pPg 
36a00 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
36a10 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
36a20 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
36a30 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
36a40 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65  rty.  This happe
36a50 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
36a60 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67   when.** the pag
36a70 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64  e has been added
36a80 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68   as a leaf of th
36a90 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73  e freelist and s
36aa0 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o its.** content
36ab0 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65   no longer matte
36ac0 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  rs..**.** The ov
36ad0 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
36ae0 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
36af0 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
36b00 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
36b10 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
36b20 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54  age is unused. T
36b30 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
36b40 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
36b50 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
36b60 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
36b70 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
36b80 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
36b90 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
36ba0 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70  tion can quadrup
36bb0 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
36bc0 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45  large .** DELETE
36bd0 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a   operations..*/.
36be0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
36bf0 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72  rDontWrite(PgHdr
36c00 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
36c10 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
36c20 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50  Pager;.  if( (pP
36c30 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
36c40 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d  IRTY) && pPager-
36c50 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29  >nSavepoint==0 )
36c60 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
36c70 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  (("DONT_WRITE pa
36c80 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
36c90 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
36ca0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
36cb0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41    IOTRACE(("CLEA
36cc0 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
36cd0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
36ce0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
36cf0 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  = PGHDR_DONT_WRI
36d00 54 45 3b 0a 20 20 20 20 70 61 67 65 72 5f 73 65  TE;.    pager_se
36d10 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
36d20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
36d30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
36d40 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
36d50 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
36d60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36d70 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e   .** change-coun
36d80 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ter, stored as a
36d90 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
36da0 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74  an integer start
36db0 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20  ing at .** byte 
36dc0 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
36dd0 20 70 61 67 65 72 20 66 69 6c 65 2e 20 20 54 68   pager file.  Th
36de0 65 20 73 65 63 6f 6e 64 61 72 79 20 63 68 61 6e  e secondary chan
36df0 67 65 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a  ge counter at.**
36e00 20 39 32 20 69 73 20 61 6c 73 6f 20 75 70 64 61   92 is also upda
36e10 74 65 64 2c 20 61 73 20 69 73 20 74 68 65 20 53  ted, as is the S
36e20 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
36e30 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39  mber at offset 9
36e40 36 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69  6..**.** But thi
36e50 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  s only happens i
36e60 66 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68  f the pPager->ch
36e70 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
36e80 61 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20  ag is false..** 
36e90 54 6f 20 61 76 6f 69 64 20 65 78 63 65 73 73 20  To avoid excess 
36ea0 63 68 75 72 6e 69 6e 67 20 6f 66 20 70 61 67 65  churning of page
36eb0 20 31 2c 20 74 68 65 20 75 70 64 61 74 65 20 6f   1, the update o
36ec0 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65  nly happens once
36ed0 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68  ..** See also th
36ee0 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  e pager_write_ch
36ef0 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 72 6f  angecounter() ro
36f00 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
36f10 61 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74 69  an .** unconditi
36f20 6f 6e 61 6c 20 75 70 64 61 74 65 20 6f 66 20 74  onal update of t
36f30 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
36f40 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
36f50 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
36f60 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  ag is zero, then
36f70 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79   this is done by
36f80 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c   calling .** sql
36f90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
36fa0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e   on page 1, then
36fb0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
36fc0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
36fd0 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20  * page data. In 
36fe0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69  this case the fi
36ff0 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74  le will be updat
37000 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ed when the curr
37010 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
37020 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
37030 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72  .**.** The isDir
37040 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79  ectMode flag may
37050 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72   only be non-zer
37060 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79  o if the library
37070 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a   was compiled.**
37080 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
37090 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
370a0 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e  RITE macro defin
370b0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
370c0 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74  ,.** if isDirect
370d0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
370e0 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
370f0 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
37100 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77  directly.** by w
37110 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65  riting an update
37120 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  d version of pag
37130 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  e 1 using a call
37140 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   to the .** sqli
37150 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e  te3OsWrite() fun
37160 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
37170 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
37180 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
37190 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
371a0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a   isDirectMode){.
371b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
371c0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
371d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
371e0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
371f0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
37200 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37210 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
37220 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
37230 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
37240 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
37250 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61  ..  /* Declare a
37260 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  nd initialize co
37270 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27  nstant integer '
37280 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68  isDirect'. If th
37290 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72  e.  ** atomic-wr
372a0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
372b0 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74   is enabled in t
372c0 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  his build, then 
372d0 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73  isDirect.  ** is
372e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
372f0 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
37300 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74   as the isDirect
37310 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20  Mode parameter. 
37320 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63   ** to this func
37330 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
37340 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65   it is always se
37350 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  t to zero..  **.
37360 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73    ** The idea is
37370 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f   that if the ato
37380 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
37390 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  zation is not.  
373a0 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ** enabled at co
373b0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20  mpile time, the 
373c0 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69  compiler can omi
373d0 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20  t the tests of. 
373e0 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62   ** 'isDirect' b
373f0 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73  elow, as well as
37400 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f   the block enclo
37410 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  sed in the.  ** 
37420 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22  "if( isDirect )"
37430 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f   condition..  */
37440 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37450 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
37460 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52  ITE.# define DIR
37470 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73  ECT_MODE 0.  ass
37480 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64  ert( isDirectMod
37490 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  e==0 );.  UNUSED
374a0 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72  _PARAMETER(isDir
374b0 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  ectMode);.#else.
374c0 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
374d0 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64  MODE isDirectMod
374e0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
374f0 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
37500 6f 75 6e 74 44 6f 6e 65 20 26 26 20 41 4c 57 41  ountDone && ALWA
37510 59 53 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  YS(pPager->dbSiz
37520 65 3e 30 29 20 29 7b 0a 20 20 20 20 50 67 48 64  e>0) ){.    PgHd
37530 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20  r *pPgHdr;      
37540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66            /* Ref
37550 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
37560 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
37570 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
37580 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  le && isOpen(pPa
37590 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20  ger->fd) );..   
375a0 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
375b0 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
375c0 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
375d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
375e0 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
375f0 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73  &pPgHdr);.    as
37600 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20  sert( pPgHdr==0 
37610 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
37620 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
37630 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63  age one was fetc
37640 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  hed successfully
37650 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
37660 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  ion is not.    *
37670 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64  * operating in d
37680 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65  irect-mode, make
37690 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65   page 1 writable
376a0 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a  .  When not in .
376b0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f      ** direct mo
376c0 64 65 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c  de, page 1 is al
376d0 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63  ways held in cac
376e0 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65  he and hence the
376f0 20 50 61 67 65 72 47 65 74 28 29 0a 20 20 20 20   PagerGet().    
37700 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61  ** above is alwa
37710 79 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20  ys successful - 
37720 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53  hence the ALWAYS
37730 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   on rc==SQLITE_O
37740 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  K..    */.    if
37750 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26  ( !DIRECT_MODE &
37760 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c  & ALWAYS(rc==SQL
37770 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  ITE_OK) ){.     
37780 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37790 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
377a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
377b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
377c0 0a 20 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c  .      /* Actual
377d0 6c 79 20 64 6f 20 74 68 65 20 75 70 64 61 74 65  ly do the update
377e0 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20 63   of the change c
377f0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
37800 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
37810 67 65 63 6f 75 6e 74 65 72 28 70 50 67 48 64 72  gecounter(pPgHdr
37820 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
37830 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63  running in direc
37840 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68  t mode, write th
37850 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  e contents of pa
37860 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65  ge 1 to the file
37870 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44  . */.      if( D
37880 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20  IRECT_MODE ){.  
37890 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
378a0 20 2a 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20   *zBuf;.        
378b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
378c0 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a  dbFileSize>0 );.
378d0 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70          CODEC2(p
378e0 50 61 67 65 72 2c 20 70 50 67 48 64 72 2d 3e 70  Pager, pPgHdr->p
378f0 44 61 74 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53  Data, 1, 6, rc=S
37900 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75  QLITE_NOMEM, zBu
37910 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
37920 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37930 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
37940 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
37950 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
37960 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
37970 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
37980 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
37990 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
379a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
379b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
379c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
379d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
379e0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
379f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37a00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37a10 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
37a20 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
37a30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
37a40 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
37a50 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
37a60 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
37a70 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
37a80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37a90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
37aa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37ab0 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73  le to disk. This
37ac0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
37ad0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
37ae0 73 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20  ses.** or pages 
37af0 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e  with the Pager.n
37b00 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a  oSync flag set..
37b10 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
37b20 66 75 6c 2c 20 6f 72 20 69 66 20 63 61 6c 6c 65  ful, or if calle
37b30 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72  d on a pager for
37b40 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e   which it is a n
37b50 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75  o-op, this.** fu
37b60 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
37b70 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
37b80 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  ise, an IO error
37b90 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
37ba0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
37bb0 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72  3PagerSync(Pager
37bc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
37bd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37be0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
37bf0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
37c00 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
37c10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37c20 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
37c30 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
37c40 6c 61 67 73 29 3b 0a 20 20 7d 65 6c 73 65 20 69  lags);.  }else i
37c50 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
37c60 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
37c70 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
37c80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
37c90 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
37ca0 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
37cb0 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54  FCNTL_SYNC_OMITT
37cc0 45 44 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ED, 0);.    if( 
37cd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
37ce0 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  UND ){.      rc 
37cf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
37d00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
37d10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
37d20 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f  s function may o
37d30 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
37d40 69 6c 65 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ile a write-tran
37d50 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
37d60 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  e in.** rollback
37d70 2e 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  . If the connect
37d80 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f  ion is in WAL mo
37d90 64 65 2c 20 74 68 69 73 20 63 61 6c 6c 20 69 73  de, this call is
37da0 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74   a no-op. .** Ot
37db0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
37dc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20  connection does 
37dd0 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 61 76 65  not already have
37de0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
37df0 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61  ck on .** the da
37e00 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 20  tabase file, an 
37e10 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
37e20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a  to obtain one..*
37e30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 43 4c  *.** If the EXCL
37e40 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c  USIVE lock is al
37e50 72 65 61 64 79 20 68 65 6c 64 20 6f 72 20 74 68  ready held or th
37e60 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  e attempt to obt
37e70 61 69 6e 20 69 74 20 69 73 0a 2a 2a 20 73 75 63  ain it is.** suc
37e80 63 65 73 73 66 75 6c 2c 20 6f 72 20 74 68 65 20  cessful, or the 
37e90 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
37ea0 20 57 41 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54   WAL mode, SQLIT
37eb0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
37ec0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
37ed0 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 42 55  either SQLITE_BU
37ee0 53 59 20 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  SY or an SQLITE_
37ef0 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
37f00 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
37f10 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
37f20 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
37f30 76 65 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  veLock(Pager *pP
37f40 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
37f50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
37f60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37f70 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37f80 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20  TER_CACHEMOD .  
37f90 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
37fa0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37fb0 49 54 45 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20  ITER_DBMOD .    
37fc0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37fd0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37fe0 45 52 5f 4c 4f 43 4b 45 44 20 0a 20 20 29 3b 0a  ER_LOCKED .  );.
37ff0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
38000 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
38010 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20 30 3d  ger) );.  if( 0=
38020 3d 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  =pagerUseWal(pPa
38030 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ger) ){.    rc =
38040 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
38050 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
38060 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  USIVE_LOCK);.  }
38070 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
38080 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
38090 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
380a0 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
380b0 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
380c0 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
380d0 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
380e0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
380f0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
38100 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
38110 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
38120 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
38130 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
38140 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
38150 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
38160 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
38170 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
38180 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
38190 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
381a0 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ures that:.**.**
381b0 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
381c0 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
381d0 75 6e 74 65 72 20 69 73 20 75 70 64 61 74 65 64  unter is updated
381e0 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75  ,.**   * the jou
381f0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28  rnal is synced (
38200 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69  unless the atomi
38210 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
38220 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a  tion is used),.*
38230 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20  *   * all dirty 
38240 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
38250 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
38260 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20  e file, .**   * 
38270 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
38280 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 28  e is truncated (
38290 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e  if required), an
382a0 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  d.**   * the dat
382b0 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
382c0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  d. .**.** The on
382d0 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20 72 65  ly thing that re
382e0 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
382f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
38300 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a  is to finalize .
38310 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e  ** (delete, trun
38320 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
38330 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 29 20   first part of) 
38340 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
38350 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20   (or .** delete 
38360 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
38370 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
38380 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
38390 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
383a0 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
383b0 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
383c0 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
383d0 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
383e0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
383f0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
38400 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  all..**.** If th
38410 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
38420 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20  r - noSync - is 
38430 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
38440 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
38450 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79  elf.** is not sy
38460 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  nced. The caller
38470 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74   must call sqlit
38480 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69  e3PagerSync() di
38490 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e  rectly to.** syn
384a0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
384b0 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
384c0 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  ng CommitPhaseTw
384d0 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68  o() to delete th
384e0 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
384f0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
38500 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
38510 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
38520 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
38530 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
38540 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
38550 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
38560 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20  char *zMaster,  
38570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
38580 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61  not NULL, the ma
38590 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
385a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e  e */.  int noSyn
385b0 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
385c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
385d0 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63  o omit the xSync
385e0 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
385f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
38600 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
38610 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
38620 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
38630 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
38640 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
38650 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
38660 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
38670 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
38680 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
38690 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
386a0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
386b0 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
386c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
386d0 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
386e0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
386f0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
38700 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  ager) );..  /* I
38710 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  f a prior error 
38720 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74  occurred, report
38730 20 74 68 61 74 20 65