/ Hex Artifact Content
Login

Artifact 56e624829268336890dad1ed864ab62df6cb2eb35633a430ca22d09b9eea3cfb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when 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 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  file */.#ifndef 
7ed0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
7ee0: 55 52 52 45 4e 54 0a 20 20 42 69 74 76 65 63 20  URRENT.  Bitvec 
7ef0: 2a 70 41 6c 6c 52 65 61 64 3b 20 20 20 20 20 20  *pAllRead;      
7f00: 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 72 65       /* Pages re
7f10: 61 64 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e  ad within curren
7f20: 74 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  t CONCURRENT tra
7f30: 6e 73 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ns. */.#endif.  
7f40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
7f50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7f60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f70: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7f80: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7f90: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7fa0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7fb0: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7fc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7fd0: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7fe0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7ff0: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
8000: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
8010: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
8020: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
8030: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
8040: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8050: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
8060: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
8070: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
8080: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
8090: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
80a0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
80b0: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
80c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
80d0: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
80e0: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
80f0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
8100: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
8110: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
8120: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
8130: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8150: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
8160: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
8170: 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74  [] */.  u32 iDat
8180: 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20  aVersion;       
8190: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
81a0: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
81b0: 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73   content changes
81c0: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
81d0: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
81e0: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
81f0: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
8200: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a  ile changes */..
8210: 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20    int nMmapOut; 
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8230: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20   Number of mmap 
8240: 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
8250: 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20  outstanding */. 
8260: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
8270: 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  zMmap;       /* 
8280: 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20  Desired maximum 
8290: 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50  mmap size */.  P
82a0: 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c  gHdr *pMmapFreel
82b0: 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist;       /* Li
82c0: 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20  st of free mmap 
82d0: 70 61 67 65 20 68 65 61 64 65 72 73 20 28 70 44  page headers (pD
82e0: 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20  irty) */.  /*.  
82f0: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f  ** End of the ro
8300: 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67  utinely-changing
8310: 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20   class members. 
8320: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
8330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20  ************/.. 
8370: 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20   u16 nExtra;    
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8390: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
83a0: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
83b0: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
83c0: 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20  i16 nReserve;   
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
83e0: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
83f0: 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20  bytes at end of 
8400: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
8410: 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20  32 vfsFlags;    
8420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
8430: 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ags for sqlite3_
8440: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
8450: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8470: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
8480: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
8490: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  ack */.  int pag
84a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
84b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
84c0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
84d0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
84e0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
84f0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
8500: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
8510: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
8520: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  i64 journalSizeL
8530: 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
8540: 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65  ize limit for pe
8550: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
8560: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72   files */.  char
8570: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
8580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8590: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
85a0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
85b0: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
85c0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
85d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
85e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  e */.  int (*xBu
85f0: 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a  syHandler)(void*
8600: 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ); /* Function t
8610: 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79  o call when busy
8620: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
8630: 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20  yHandlerArg;    
8640: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67    /* Context arg
8650: 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48  ument for xBusyH
8660: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20  andler */.  int 
8670: 61 53 74 61 74 5b 34 5d 3b 20 20 20 20 20 20 20  aStat[4];       
8680: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
8690: 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73   cache hits, mis
86a0: 73 65 73 2c 20 77 72 69 74 65 73 2c 20 73 70 69  ses, writes, spi
86b0: 6c 6c 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  lls */.#ifdef SQ
86c0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
86d0: 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  nRead;          
86e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
86f0: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 20 2a  ase pages read *
8700: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
8710: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
8720: 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  age*); /* Call t
8730: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
8740: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
8750: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 47 65 74   */.  int (*xGet
8760: 29 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62  )(Pager*,Pgno,Db
8770: 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 20 2f 2a 20  Page**,int); /* 
8780: 52 6f 75 74 69 6e 65 20 74 6f 20 66 65 74 63 68  Routine to fetch
8790: 20 61 20 70 61 74 63 68 20 2a 2f 0a 23 69 66 64   a patch */.#ifd
87a0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
87b0: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
87c0: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
87d0: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
87e0: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
87f0: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
8800: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
8810: 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
8820: 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69  nt,int); /* Noti
8830: 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20  fy of page size 
8840: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69  changes */.  voi
8850: 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
8860: 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20  void*);         
8870: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
8880: 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20  r for the codec 
8890: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
88a0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
88b0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
88c0: 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20  nt to xCodec... 
88d0: 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69  methods */.#endi
88e0: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
88f0: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
8900: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
8910: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8920: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
8930: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
8940: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8950: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
8960: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
8970: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8980: 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a  OMIT_WAL.  Wal *
8990: 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pWal;           
89a0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d         /* Write-
89b0: 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62  ahead log used b
89c0: 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  y "journal_mode=
89d0: 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a  wal" */.  char *
89e0: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
89f0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
8a00: 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65  me for write-ahe
8a10: 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66  ad log */.#endif
8a20: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78  .};../*.** Index
8a30: 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  es for use with 
8a40: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54  Pager.aStat[]. T
8a50: 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  he Pager.aStat[]
8a60: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a   array contains.
8a70: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63  ** the values ac
8a80: 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e  cessed by passin
8a90: 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  g SQLITE_DBSTATU
8aa0: 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43  S_CACHE_HIT, CAC
8ab0: 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43  HE_MISS .** or C
8ac0: 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71  ACHE_WRITE to sq
8ad0: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8ae0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8af0: 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30  GER_STAT_HIT   0
8b00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8b10: 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66  TAT_MISS  1.#def
8b20: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57  ine PAGER_STAT_W
8b30: 52 49 54 45 20 32 0a 23 64 65 66 69 6e 65 20 50  RITE 2.#define P
8b40: 41 47 45 52 5f 53 54 41 54 5f 53 50 49 4c 4c 20  AGER_STAT_SPILL 
8b50: 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  3../*.** The fol
8b60: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8b70: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8b80: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8b90: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8ba0: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8bb0: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8bc0: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8bd0: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8be0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8bf0: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
8c00: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
8c10: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
8c20: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8c30: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
8c40: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8c50: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8c60: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8c70: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8c80: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8c90: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8ca0: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8cb0: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8cc0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8cd0: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8ce0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8cf0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
8d00: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
8d10: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
8d20: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
8d30: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8d40: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
8d50: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8d60: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8d70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8d80: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8d90: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8da0: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8db0: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8dc0: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8dd0: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8de0: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8df0: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8e00: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8e10: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8e20: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8e30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8e40: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8e50: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8e60: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8e70: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8e80: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8e90: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8ea0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8eb0: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8ec0: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8ed0: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8ee0: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8ef0: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8f00: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8f10: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8f20: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8f30: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8f40: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8f50: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8f60: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8f70: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8f80: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8f90: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8fa0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8fb0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8fc0: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8fd0: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8fe0: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8ff0: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
9000: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
9010: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
9020: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
9030: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
9040: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
9050: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
9060: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
9070: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
9080: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
9090: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
90a0: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
90b0: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
90c0: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
90d0: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
90e0: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
90f0: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
9100: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
9110: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
9120: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
9130: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
9140: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
9150: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
9160: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
9170: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
9180: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
9190: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
91a0: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
91b0: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
91c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
91d0: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
91e0: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
91f0: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
9200: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
9210: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
9220: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
9230: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
9240: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
9250: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
9260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9270: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
9280: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
9290: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
92a0: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
92b0: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
92c0: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
92d0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
92e0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
92f0: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
9300: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
9310: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
9320: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
9330: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
9340: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
9350: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9360: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9370: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9380: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9390: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
93a0: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
93b0: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
93c0: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
93d0: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
93e0: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
93f0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
9400: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
9410: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
9420: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
9430: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
9440: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
9450: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9460: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9470: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9480: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9490: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
94a0: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
94b0: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
94c0: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
94d0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
94e0: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
94f0: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
9500: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
9510: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
9520: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
9530: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9540: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
9550: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9560: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9570: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9580: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9590: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
95a0: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
95b0: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
95c0: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
95d0: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
95e0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
95f0: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
9600: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
9610: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
9620: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
9630: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
9640: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
9650: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9660: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9670: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9680: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9690: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
96a0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
96b0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
96c0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
96d0: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
96e0: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
96f0: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
9700: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
9710: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
9720: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
9730: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
9740: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
9750: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9760: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9770: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9780: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9790: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
97a0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
97b0: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
97c0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
97d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
97e0: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
97f0: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
9800: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
9810: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
9820: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
9830: 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
9840: 41 44 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  AD./*.** Return 
9850: 74 72 75 65 20 69 66 20 70 61 67 65 20 70 67 6e  true if page pgn
9860: 6f 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  o can be read di
9870: 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
9880: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
9890: 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c   by the b-tree l
98a0: 61 79 65 72 2e 20 54 68 69 73 20 69 73 20 74 68  ayer. This is th
98b0: 65 20 63 61 73 65 20 69 66 3a 0a 2a 2a 0a 2a 2a  e case if:.**.**
98c0: 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
98d0: 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 0a  e file is open,.
98e0: 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
98f0: 20 6e 6f 20 64 69 72 74 79 20 70 61 67 65 73 20   no dirty pages 
9900: 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e  in the cache, an
9910: 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 65 73  d.**   * the des
9920: 69 72 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  ired page is not
9930: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
9940: 65 20 77 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 69  e wal file..*/.i
9950: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  nt sqlite3PagerD
9960: 69 72 65 63 74 52 65 61 64 4f 6b 28 50 61 67 65  irectReadOk(Page
9970: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
9980: 70 67 6e 6f 29 7b 0a 20 20 69 66 28 20 70 50 61  pgno){.  if( pPa
9990: 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
99a0: 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  s==0 ) return 0;
99b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 43  .  if( sqlite3PC
99c0: 61 63 68 65 49 73 44 69 72 74 79 28 70 50 61 67  acheIsDirty(pPag
99d0: 65 72 2d 3e 70 50 43 61 63 68 65 29 20 29 20 72  er->pPCache) ) r
99e0: 65 74 75 72 6e 20 30 3b 0a 23 69 66 64 65 66 20  eturn 0;.#ifdef 
99f0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
9a00: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
9a10: 43 6f 64 65 63 21 3d 30 20 29 20 72 65 74 75 72  Codec!=0 ) retur
9a20: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e  n 0;.#endif.#ifn
9a30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9a40: 57 41 4c 0a 20 20 69 66 28 20 70 50 61 67 65 72  WAL.  if( pPager
9a50: 2d 3e 70 57 61 6c 20 29 7b 0a 20 20 20 20 75 33  ->pWal ){.    u3
9a60: 32 20 69 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  2 iRead = 0;.   
9a70: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20   int rc;.    rc 
9a80: 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
9a90: 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
9aa0: 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 52 65 61 64  al, pgno, &iRead
9ab0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 72  );.    return (r
9ac0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
9ad0: 69 52 65 61 64 3d 3d 30 29 3b 0a 20 20 7d 0a 23  iRead==0);.  }.#
9ae0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31  endif.  return 1
9af0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
9b00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9b10: 57 41 4c 0a 23 20 64 65 66 69 6e 65 20 70 61 67  WAL.# define pag
9b20: 65 72 55 73 65 57 61 6c 28 78 29 20 28 28 78 29  erUseWal(x) ((x)
9b30: 2d 3e 70 57 61 6c 21 3d 30 29 0a 23 65 6c 73 65  ->pWal!=0).#else
9b40: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
9b50: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
9b60: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
9b70: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9b80: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9b90: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9ba0: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9bb0: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
9bc0: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
9bd0: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
9be0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
9bf0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9c00: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
9c10: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
9c20: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
9c30: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
9c40: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
9c50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9c60: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
9c70: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9c80: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9c90: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9ca0: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9cb0: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
9cc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
9cd0: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9ce0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
9cf0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9d00: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
9d10: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
9d20: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
9d30: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
9d40: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9d50: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
9d60: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9d70: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9d80: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9d90: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9da0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9db0: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9dc0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9dd0: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
9de0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9df0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9e00: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9e10: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9e20: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
9e30: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
9e40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
9e50: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
9e60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
9e70: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9e80: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9e90: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9ea0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9eb0: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
9ec0: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
9ed0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
9ee0: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
9ef0: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9f00: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9f10: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9f20: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9f30: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9f40: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
9f50: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9f60: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9f70: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9f80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9f90: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9fa0: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9fb0: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
9fc0: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
9fd0: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
9fe0: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
9ff0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
a000: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
a010: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
a020: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
a030: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a040: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
a050: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
a060: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
a070: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
a080: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
a090: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
a0a0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
a0b0: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
a0c0: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
a0d0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
a0e0: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
a0f0: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
a100: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
a110: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
a120: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
a130: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
a140: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
a150: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
a160: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
a170: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
a180: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
a190: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
a1a0: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
a1b0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
a1c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
a1d0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
a1e0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
a1f0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
a200: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
a210: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
a220: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
a230: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
a240: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
a250: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
a260: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
a270: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
a280: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
a290: 72 74 28 20 21 69 73 4f 70 65 6e 28 70 2d 3e 66  rt( !isOpen(p->f
a2a0: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
a2b0: 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ( p->noSync );. 
a2c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f     assert( p->jo
a2d0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a2e0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a2f0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d   .         || p-
a300: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a310: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a320: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20  MEMORY .    );. 
a330: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53     assert( p->eS
a340: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
a350: 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d  R && p->eState!=
a360: 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
a370: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
a380: 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20  seWal(p)==0 );. 
a390: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e   }..  /* If chan
a3a0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73  geCountDone is s
a3b0: 65 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c  et, a RESERVED l
a3c0: 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
a3d0: 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a  ust be held.  **
a3e0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   on the file..  
a3f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
a400: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
a410: 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Done==0 || pPage
a420: 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  r->eLock>=RESERV
a430: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
a440: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50  ert( p->eLock!=P
a450: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a  ENDING_LOCK );..
a460: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74    switch( p->eSt
a470: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
a480: 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20  PAGER_OPEN:.    
a490: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
a4a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a4b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a4c0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a4d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a4e0: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
a4f0: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
a500: 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65  che)==0 || pPage
a510: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
a520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a530: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44   case PAGER_READ
a540: 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ER:.      assert
a550: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a560: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a570: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a580: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
a590: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a5a0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a5b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
a5c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a5d0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
a5e0: 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20  ER_LOCKED:.     
a5f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a600: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a610: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a620: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a630: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a640: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
a650: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
a660: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a670: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
a680: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
a690: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
a6a0: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
a6b0: 4e 54 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  NT.      assert(
a6c0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
a6d0: 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
a6e0: 69 7a 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  ize || pPager->p
a6f0: 41 6c 6c 52 65 61 64 20 29 3b 0a 23 65 6e 64 69  AllRead );.#endi
a700: 66 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  f.      assert( 
a710: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a720: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a730: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a740: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a750: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a760: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a770: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a780: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a790: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
a7a0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a7b0: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a7c0: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
a7d0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a7e0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a7f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a800: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a810: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a820: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a830: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a840: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
a850: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
a860: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
a870: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
a880: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a890: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
a8a0: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
a8b0: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
a8c0: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
a8d0: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
a8e0: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
a8f0: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
a900: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
a910: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
a920: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a930: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a940: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a950: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a960: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
a970: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a980: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a990: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a9a0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a9b0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a9d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a9e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a9f0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
aa00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
aa10: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
aa20: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
aa30: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
aa40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
aa50: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
aa60: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
aa70: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
aa80: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
aa90: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
aaa0: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
aab0: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
aac0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
aad0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
aae0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
aaf0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
ab00: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
ab10: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
ab20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ab30: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
ab40: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
ab50: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
ab60: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
ab70: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
ab80: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
ab90: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
aba0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
abb0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
abc0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
abd0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
abe0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
abf0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
ac00: 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  p->fd)&SQLITE_IO
ac10: 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
ac20: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
ac30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ac40: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
ac50: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
ac60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ac70: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
ac80: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
ac90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
aca0: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
acb0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
acc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
acd0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
ace0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
acf0: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
ad00: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
ad10: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
ad20: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
ad30: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
ad40: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
ad50: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
ad60: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
ad70: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
ad80: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
ad90: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20  WAL .           
ada0: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
adb0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
adc0: 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45  cs(p->fd)&SQLITE
add0: 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f  _IOCAP_BATCH_ATO
ade0: 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  MIC).      );.  
adf0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
ae00: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
ae10: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
ae20: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
ae30: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
ae40: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
ae50: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
ae60: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
ae70: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
ae80: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
ae90: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
aea0: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
aeb0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
aec0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
aed0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
aee0: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
aef0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
af00: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
af10: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
af20: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c  r->pPCache)>0 ||
af30: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
af40: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
af50: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
af60: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  1;.}.#endif /* i
af70: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a  fndef NDEBUG */.
af80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
af90: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75  EBUG ./*.** Retu
afa0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
afb0: 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  a human readable
afc0: 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61   string in a sta
afd0: 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f  tic buffer.** co
afe0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61  ntaining the sta
aff0: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
b000: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
b010: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68   an argument. Th
b020: 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65  is.** is intende
b030: 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  d to be used wit
b040: 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46  hin debuggers. F
b050: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61  or example, as a
b060: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  n alternative.**
b070: 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67   to "print *pPag
b080: 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a  er" in gdb:.**.*
b090: 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22  * (gdb) printf "
b0a0: 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72  %s", print_pager
b0b0: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a  _state(pPager).*
b0c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b0d0: 65 20 68 61 73 20 65 78 74 65 72 6e 61 6c 20 6c  e has external l
b0e0: 69 6e 6b 61 67 65 20 69 6e 20 6f 72 64 65 72 20  inkage in order 
b0f0: 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d 70  to suppress comp
b100: 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 0a 2a 2a  iler warnings.**
b110: 20 61 62 6f 75 74 20 61 6e 20 75 6e 75 73 65 64   about an unused
b120: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 69   function.  It i
b130: 73 20 65 6e 63 6c 6f 73 65 64 20 77 69 74 68 69  s enclosed withi
b140: 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  n SQLITE_DEBUG a
b150: 6e 64 20 73 6f 20 64 6f 65 73 0a 2a 2a 20 6e 6f  nd so does.** no
b160: 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d  t appear in norm
b170: 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 63 68  al builds..*/.ch
b180: 61 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f  ar *print_pager_
b190: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
b1a0: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
b1b0: 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71  Ret[1024];..  sq
b1c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
b1d0: 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20  024, zRet,.     
b1e0: 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20   "Filename:     
b1f0: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74   %s\n".      "St
b200: 61 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20  ate:         %s 
b210: 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20  errCode=%d\n".  
b220: 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20      "Lock:      
b230: 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20      %s\n".      
b240: 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20  "Locking mode:  
b250: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c  locking_mode=%s\
b260: 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61  n".      "Journa
b270: 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c  l mode:  journal
b280: 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20  _mode=%s\n".    
b290: 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65    "Backing store
b2a0: 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65  : tempFile=%d me
b2b0: 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61  mDb=%d useJourna
b2c0: 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a  l=%d\n".      "J
b2d0: 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f  ournal:       jo
b2e0: 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f  urnalOff=%lld jo
b2f0: 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22  urnalHdr=%lld\n"
b300: 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20  .      "Size:   
b310: 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64         dbsize=%d
b320: 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64   dbOrigSize=%d d
b330: 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a  bFileSize=%d\n".
b340: 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65        , p->zFile
b350: 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  name.      , p->
b360: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
b370: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20  EN            ? 
b380: 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20  "OPEN" :.       
b390: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
b3a0: 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20  R_READER        
b3b0: 20 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20    ? "READER" :. 
b3c0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
b3d0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
b3e0: 4f 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45  OCKED   ? "WRITE
b3f0: 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20  R_LOCKED" :.    
b400: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b410: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
b420: 45 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43  EMOD ? "WRITER_C
b430: 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20  ACHEMOD" :.     
b440: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b450: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
b460: 20 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42      ? "WRITER_DB
b470: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b480: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b490: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
b4a0: 3f 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ? "WRITER_FINISH
b4b0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
b4c0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
b4d0: 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f  RROR           ?
b4e0: 20 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72   "ERROR" : "?err
b4f0: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e  or?".      , (in
b500: 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  t)p->errCode.   
b510: 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e     , p->eLock==N
b520: 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f  O_LOCK         ?
b530: 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20   "NO_LOCK" :.   
b540: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52       p->eLock==R
b550: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f  ESERVED_LOCK   ?
b560: 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20   "RESERVED" :.  
b570: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b580: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
b590: 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a  ? "EXCLUSIVE" :.
b5a0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
b5b0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  ==SHARED_LOCK   
b5c0: 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20    ? "SHARED" :. 
b5d0: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b5e0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20  =UNKNOWN_LOCK   
b5f0: 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22   ? "UNKNOWN" : "
b600: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
b610: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
b620: 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20  e ? "exclusive" 
b630: 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20  : "normal".     
b640: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64   , p->journalMod
b650: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b660: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20  MODE_MEMORY   ? 
b670: 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20  "memory" :.     
b680: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b690: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b6a0: 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20  MODE_OFF      ? 
b6b0: 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20  "off" :.        
b6c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b6d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b6e0: 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65  E_DELETE   ? "de
b6f0: 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  lete" :.        
b700: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b710: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b720: 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65  E_PERSIST  ? "pe
b730: 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20  rsist" :.       
b740: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b750: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b760: 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74  DE_TRUNCATE ? "t
b770: 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20  runcate" :.     
b780: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b790: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b7a0: 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20  MODE_WAL      ? 
b7b0: 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f  "wal" : "?error?
b7c0: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
b7d0: 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74  ->tempFile, (int
b7e0: 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29  )p->memDb, (int)
b7f0: 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  p->useJournal.  
b800: 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c      , p->journal
b810: 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48  Off, p->journalH
b820: 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  dr.      , (int)
b830: 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29  p->dbSize, (int)
b840: 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28  p->dbOrigSize, (
b850: 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a  int)p->dbFileSiz
b860: 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  e.  );..  return
b870: 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a   zRet;.}.#endif.
b880: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
b890: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 76 61  rences to the va
b8a0: 72 69 6f 75 73 20 70 61 67 65 20 67 65 74 74 65  rious page gette
b8b0: 72 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  rs */.static int
b8c0: 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50   getPageNormal(P
b8d0: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b8e0: 65 2a 2a 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63  e**,int);.static
b8f0: 20 69 6e 74 20 67 65 74 50 61 67 65 45 72 72 6f   int getPageErro
b900: 72 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62  r(Pager*,Pgno,Db
b910: 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66  Page**,int);.#if
b920: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
b930: 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
b940: 6e 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28 50  nt getPageMMap(P
b950: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b960: 65 2a 2a 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66  e**,int);.#endif
b970: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
b980: 50 61 67 65 72 2e 78 47 65 74 20 6d 65 74 68 6f  Pager.xGet metho
b990: 64 20 66 6f 72 20 74 68 65 20 61 70 70 72 6f 70  d for the approp
b9a0: 72 69 61 74 65 20 72 6f 75 74 69 6e 65 20 75 73  riate routine us
b9b0: 65 64 20 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63  ed to fetch.** c
b9c0: 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
b9d0: 70 61 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  pager..*/.static
b9e0: 20 76 6f 69 64 20 73 65 74 47 65 74 74 65 72 4d   void setGetterM
b9f0: 65 74 68 6f 64 28 50 61 67 65 72 20 2a 70 50 61  ethod(Pager *pPa
ba00: 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
ba10: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
ba20: 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20     pPager->xGet 
ba30: 3d 20 67 65 74 50 61 67 65 45 72 72 6f 72 3b 0a  = getPageError;.
ba40: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
ba50: 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c  MAP_SIZE>0.  }el
ba60: 73 65 20 69 66 28 20 55 53 45 46 45 54 43 48 28  se if( USEFETCH(
ba70: 70 50 61 67 65 72 29 0a 23 69 66 64 65 66 20 53  pPager).#ifdef S
ba80: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
ba90: 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43     && pPager->xC
baa0: 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20  odec==0.#endif. 
bab0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
bac0: 78 47 65 74 20 3d 20 67 65 74 50 61 67 65 4d 4d  xGet = getPageMM
bad0: 61 70 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ap;.#endif /* SQ
bae0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
baf0: 5a 45 3e 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  ZE>0 */.  }else{
bb00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65  .    pPager->xGe
bb10: 74 20 3d 20 67 65 74 50 61 67 65 4e 6f 72 6d 61  t = getPageNorma
bb20: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
bb30: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
bb40: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
bb50: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
bb60: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
bb70: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
bb80: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
bb90: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
bba0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
bbb0: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
bbc0: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
bbd0: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
bbe0: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
bbf0: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
bc00: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
bc10: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
bc20: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
bc30: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
bc40: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
bc50: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
bc60: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
bc70: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
bc80: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
bc90: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
bca0: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
bcb0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
bcc0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
bcd0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
bce0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
bcf0: 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  *p;.  Pgno pgno 
bd00: 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69  = pPg->pgno;.  i
bd10: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
bd20: 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   i<pPager->nSave
bd30: 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  point; i++){.   
bd40: 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53   p = &pPager->aS
bd50: 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20  avepoint[i];.   
bd60: 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70   if( p->nOrig>=p
bd70: 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  gno && 0==sqlite
bd80: 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75  3BitvecTestNotNu
bd90: 6c 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  ll(p->pInSavepoi
bda0: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
bdb0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
bdc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bdd0: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
bde0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
bdf0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
be00: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
be10: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
be20: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
be30: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
be40: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
be50: 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
be60: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
be70: 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
be80: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
be90: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e  Pg->pgno);.}.#en
bea0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
beb0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
bec0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
bed0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
bee0: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
bef0: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
bf00: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
bf10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
bf20: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
bf30: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
bf40: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
bf50: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
bf60: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
bf70: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
bf80: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
bf90: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
bfa0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
bfb0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
bfc0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
bfd0: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
bfe0: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
bff0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
c000: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
c010: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
c020: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
c030: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c040: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
c050: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
c060: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c070: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
c080: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
c090: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
c0a0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
c0b0: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
c0c0: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
c0d0: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
c0e0: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
c0f0: 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  B).../*.** Write
c100: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
c110: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
c120: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c130: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
c140: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
c150: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
c160: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
c170: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
c180: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
c190: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
c1a0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
c1b0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
c1c0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
c1d0: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
c1e0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
c1f0: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
c200: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
c210: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
c220: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c230: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
c240: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
c250: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20  ther NO_LOCK.** 
c260: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20  or SHARED_LOCK. 
c270: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
c280: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
c290: 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b   call to xUnlock
c2a0: 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20  ().** succeeds, 
c2b0: 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c  set the Pager.eL
c2c0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
c2d0: 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d  match the (attem
c2e0: 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a  pted) new lock..
c2f0: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
c300: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
c310: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
c320: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
c330: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
c340: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
c350: 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63  fy it. See the c
c360: 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
c370: 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20   #define of .** 
c380: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
c390: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
c3a0: 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  of this..*/.stat
c3b0: 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f  ic int pagerUnlo
c3c0: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
c3d0: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
c3e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c3f0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
c400: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
c410: 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
c420: 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20  r->eLock==eLock 
c430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
c440: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck==NO_LOCK || e
c450: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c460: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
c470: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
c480: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
c490: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ger)==0 );.  if(
c4a0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c4b0: 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
c4c0: 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
c4d0: 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72  >=eLock );.    r
c4e0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
c4f0: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
c500: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
c510: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
c520: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ck);.    if( pPa
c530: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
c540: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
c550: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c560: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c570: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
c580: 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  "UNLOCK %p %d\n"
c590: 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29  , pPager, eLock)
c5a0: 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ).  }.  return r
c5b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
c5c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c5d0: 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63  le to level eLoc
c5e0: 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65  k, which must be
c5f0: 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c   either SHARED_L
c600: 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44  OCK,.** RESERVED
c610: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
c620: 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20  VE_LOCK. If the 
c630: 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73  caller is succes
c640: 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a  sful, set the.**
c650: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
c660: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77  iable to the new
c670: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20   locking state. 
c680: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
c690: 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73  f Pager.eLock is
c6a0: 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
c6b0: 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66  LOCK when this f
c6c0: 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63  unction is .** c
c6d0: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
c6e0: 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74  dify it unless t
c6f0: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
c700: 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56  tate is EXCLUSIV
c710: 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20  E_LOCK. .** See 
c720: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
c730: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
c740: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
c750: 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
c760: 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f   .** of this..*/
c770: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
c780: 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70  rLockDb(Pager *p
c790: 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b  Pager, int eLock
c7a0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
c7b0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
c7c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  rt( eLock==SHARE
c7d0: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
c7e0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
c7f0: 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  | eLock==EXCLUSI
c800: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  VE_LOCK );.  if(
c810: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65   pPager->eLock<e
c820: 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Lock || pPager->
c830: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
c840: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  OCK ){.    rc = 
c850: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c860: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c870: 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
c880: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
c890: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c8a0: 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d  E_OK && (pPager-
c8b0: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c8c0: 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43  LOCK||eLock==EXC
c8d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a  LUSIVE_LOCK) ){.
c8e0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
c8f0: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
c900: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
c910: 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
c920: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
c930: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c940: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c950: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
c960: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
c970: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
c980: 69 63 2d 77 72 69 74 65 20 6f 72 0a 2a 2a 20 61  ic-write or.** a
c990: 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72 69 74  tomic-batch-writ
c9a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  e optimizations 
c9b0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
c9c0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
c9d0: 0a 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  .** atomic-write
c9e0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
c9f0: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
ca00: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
ca10: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
ca20: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
ca30: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
ca40: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
ca50: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
ca60: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
ca70: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
ca80: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
ca90: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
caa0: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
cab0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
cac0: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
cad0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
cae0: 2a 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  * If it can be u
caf0: 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  sed, then the va
cb00: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
cb10: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
cb20: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
cb30: 20 77 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e   when it contain
cb40: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
cb50: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
cb60: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
cb70: 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72 69  atomic-batch-wri
cb80: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
cb90: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20 4f  can be used if O
cba0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
cbb0: 69 73 74 69 63 73 28 29 0a 2a 2a 20 72 65 74 75  istics().** retu
cbc0: 72 6e 73 20 61 20 76 61 6c 75 65 20 77 69 74 68  rns a value with
cbd0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
cbe0: 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20 62  P_BATCH_ATOMIC b
cbf0: 69 74 20 73 65 74 2e 20 2d 31 20 69 73 0a 2a 2a  it set. -1 is.**
cc00: 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69   returned in thi
cc10: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
cc20: 20 6e 65 69 74 68 65 72 20 6f 70 74 69 6d 69 7a   neither optimiz
cc30: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
cc40: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
cc50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cc60: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
cc70: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
cc80: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
cc90: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
cca0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
ccb0: 4f 4d 49 43 5f 57 52 49 54 45 29 20 5c 0a 20 7c  OMIC_WRITE) \. |
ccc0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
ccd0: 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
cce0: 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 69 6e  OMIC_WRITE).  in
ccf0: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
cd20: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20  teristics */..  
cd30: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
cd40: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
cd50: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
cd60: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
cd70: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
cd80: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
cd90: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 72  PARAMETER(pPager
cda0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
cdb0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
cdc0: 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49  BATCH_ATOMIC_WRI
cdd0: 54 45 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  TE.  if( pPager-
cde0: 3e 64 62 53 69 7a 65 3e 30 20 26 26 20 28 64 63  >dbSize>0 && (dc
cdf0: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41  &SQLITE_IOCAP_BA
ce00: 54 43 48 5f 41 54 4f 4d 49 43 29 20 29 7b 0a 20  TCH_ATOMIC) ){. 
ce10: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
ce20: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
ce30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
ce40: 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 7b 0a  TOMIC_WRITE.  {.
ce50: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 20      int nSector 
ce60: 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  = pPager->sector
ce70: 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Size;.    int sz
ce80: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
ce90: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
cea0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
ceb0: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
cec0: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
ced0: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
cee0: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
cef0: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
cf00: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
cf10: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
cf20: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
cf30: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
cf40: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
cf50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
cf60: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
cf70: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
cf80: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
cf90: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
cfa0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
cfb0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
cfc0: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
cfd0: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
cfe0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
cff0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
d000: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
d010: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
d020: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
d030: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
d040: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
d050: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
d060: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
d070: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
d080: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
d090: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
d0a0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
d0b0: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
d0c0: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
d0d0: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
d0e0: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
d0f0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
d100: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
d110: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
d120: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
d130: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
d140: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
d150: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
d160: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
d170: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
d180: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
d190: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
d1a0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
d1b0: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
d1c0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
d1d0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
d1e0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
d1f0: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
d200: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
d210: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
d220: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
d230: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
d240: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
d250: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
d260: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
d270: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
d280: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
d290: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
d2a0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
d2b0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
d2c0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
d2d0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
d2e0: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
d2f0: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
d300: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
d310: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
d320: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
d330: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
d340: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
d350: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
d360: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
d370: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
d380: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
d390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
d3a0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
d3b0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
d3c0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
d3d0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
d3e0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
d3f0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
d400: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
d410: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
d420: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
d430: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
d440: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
d450: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
d460: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
d470: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
d480: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
d490: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
d4a0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
d4b0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
d4c0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
d4d0: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
d4e0: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
d4f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d500: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
d510: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
d520: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
d530: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
d540: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
d550: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
d560: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
d570: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
d580: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
d590: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
d5a0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
d5b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d5c0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
d5d0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
d5e0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
d5f0: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
d600: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
d610: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
d620: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
d630: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
d640: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
d650: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
d660: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
d670: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
d680: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
d690: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
d6a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
d6b0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
d6c0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
d6d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
d6e0: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
d6f0: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
d700: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
d710: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
d720: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
d730: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
d740: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
d750: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
d760: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
d770: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
d780: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
d790: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
d7a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
d7b0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
d7c0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
d7d0: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
d7e0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
d7f0: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
d800: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
d810: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
d820: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
d830: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
d840: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
d850: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
d860: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
d870: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
d880: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
d890: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
d8a0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
d8b0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
d8c0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
d8d0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
d8e0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
d8f0: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
d900: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
d910: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
d920: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
d930: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
d940: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
d950: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
d960: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
d970: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
d980: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
d9b0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d9d0: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
d9e0: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
d9f0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
da00: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
da10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
da20: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
da30: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
da40: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
da50: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
da60: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
da70: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
da80: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
da90: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dab0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
dac0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
dad0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
dae0: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
daf0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
db00: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
db10: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
db20: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
db30: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
db40: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
db50: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
db60: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
db70: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
db80: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
db90: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
dba0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
dbb0: 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3e 73 7a  er .   || len>sz
dbc0: 4a 2d 31 36 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d  J-16.   || len==
dbd0: 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  0 .   || SQLITE_
dbe0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
dbf0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
dc00: 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20  12, &cksum)).   
dc10: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
dc20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
dc30: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
dc40: 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c   8, szJ-8)).   |
dc50: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
dc60: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
dc70: 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  8).   || SQLITE_
dc80: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
dc90: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
dca0: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
dcb0: 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20  -16-len)).  ){. 
dcc0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
dcd0: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
dce0: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
dcf0: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
dd00: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
dd10: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
dd20: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
dd30: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
dd40: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
dd50: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
dd60: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
dd70: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
dd80: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
dd90: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
dda0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
ddb0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ddc0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
ddd0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
dde0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
ddf0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
de00: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
de10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
de20: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
de30: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
de40: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
de50: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
de60: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  0;.  }.  zMaster
de70: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
de80: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
de90: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
dea0: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
deb0: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62   of the sector b
dec0: 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d  oundary at or im
ded0: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f  mediately .** fo
dee0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75  llowing the valu
def0: 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e in pPager->jou
df00: 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e  rnalOff, assumin
df10: 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73  g a sector .** s
df20: 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73  ize of pPager->s
df30: 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e  ectorSize bytes.
df40: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
df50: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
df60: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  512:.**.**   Pag
df70: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20  er.journalOff   
df80: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61         Return va
df90: 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  lue.**   -------
dfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfc0: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20  0.**   512      
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e000: 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20   512.**   100   
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30      512.**   200
e030: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
e040: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
e050: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f  */.static i64 jo
e060: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50  urnalHdrOffset(P
e070: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
e080: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
e090: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
e0a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
e0b0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
e0c0: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
e0d0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
e0e0: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
e0f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e100: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
e110: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
e120: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
e130: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e140: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
e150: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
e160: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
e170: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
e180: 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  turn offset;.}..
e190: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
e1a0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
e1b0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
e1c0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
e1d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
e1e0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
e1f0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
e200: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
e210: 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  n written to.** 
e220: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
e230: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
e240: 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f  i.e. if Pager.jo
e250: 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a  urnalOff==0)..**
e260: 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74  .** If doTruncat
e270: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  e is non-zero or
e280: 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e   the Pager.journ
e290: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69  alSizeLimit vari
e2a0: 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  able is.** set t
e2b0: 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  o 0, then trunca
e2c0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
e2d0: 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
e2e0: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
e2f0: 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68  wise,.** zero th
e300: 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72  e 28-byte header
e310: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
e320: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e330: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
e340: 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  e, .** if the pa
e350: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f  ger is not in no
e360: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63  -sync mode, sync
e370: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e380: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  e immediately .*
e390: 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  * after writing 
e3a0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74  or truncating it
e3b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72  ..**.** If Pager
e3c0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
e3d0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  t is set to a po
e3e0: 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  sitive, non-zero
e3f0: 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66   value, and.** f
e400: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75  ollowing the tru
e410: 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69  ncation or zeroi
e420: 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ng described abo
e430: 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ve the size of t
e440: 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  he .** journal f
e450: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20  ile in bytes is 
e460: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
e470: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75   value, then tru
e480: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncate the.** jou
e490: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67  rnal file to Pag
e4a0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
e4b0: 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a  mit bytes. The j
e4c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
e4d0: 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  .** not need to 
e4e0: 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  be synced follow
e4f0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
e500: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
e510: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
e520: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
e530: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
e540: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
e550: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
e560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e570: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e580: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
e590: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
e5a0: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
e5b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e5c0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5e0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
e5f0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
e600: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
e610: 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
e620: 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49  !sqlite3JournalI
e630: 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
e640: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
e650: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e660: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
e670: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
e680: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
e690: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
e6a0: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
e6b0: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
e6c0: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
e6d0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
e6e0: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
e6f0: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
e700: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e710: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
e720: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
e730: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
e740: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
e750: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
e760: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e770: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
e780: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
e790: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
e7a0: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
e7b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e7c0: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
e7d0: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
e7e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
e7f0: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
e800: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
e810: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
e820: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  Flags);.    }.. 
e830: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
e840: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
e850: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
e860: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
e870: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
e880: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
e890: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
e8a0: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
e8b0: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
e8c0: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
e8d0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
e8e0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
e8f0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
e900: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
e910: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
e920: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
e930: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
e940: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
e950: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
e960: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
e970: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
e980: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
e990: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e9a0: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
e9b0: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
e9c0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e9d0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
e9e0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
e9f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
ea00: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
ea10: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
ea20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ea30: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
ea40: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
ea50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ea60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ea70: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
ea80: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
ea90: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
eaa0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
eab0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
eac0: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
ead0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
eae0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
eaf0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
eb00: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
eb10: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
eb20: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
eb30: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
eb40: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
eb50: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
eb60: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
eb70: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
eb80: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
eb90: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
eba0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
ebb0: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
ebc0: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
ebd0: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
ebe0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
ebf0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
ec00: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
ec10: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
ec20: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
ec30: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
ec40: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
ec50: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
ec60: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
ec70: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
ec80: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
ec90: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
eca0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
ecb0: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
ecc0: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
ecd0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
ece0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
ecf0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
ed00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ed20: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
ed30: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
ed40: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
ed50: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
ed60: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
ed70: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
ed80: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
ed90: 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  = (u32)pPager->p
eda0: 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20  ageSize;/* Size 
edb0: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
edc0: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
edd0: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
ee00: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
ee10: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
ee20: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ee50: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
ee60: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
ee70: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
ee80: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
ee90: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
eea0: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
eeb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
eec0: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
eed0: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
eee0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
eef0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
ef00: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
ef10: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
ef20: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
ef30: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
ef40: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
ef50: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
ef60: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
ef70: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
ef80: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
ef90: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
efa0: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
efb0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
efc0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
efd0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
efe0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
eff0: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
f000: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
f010: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
f020: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
f030: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
f040: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
f050: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
f060: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f070: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
f080: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
f090: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
f0a0: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
f0b0: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
f0c0: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
f0d0: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
f0e0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
f0f0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
f100: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
f110: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
f120: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
f130: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
f140: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
f150: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
f160: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
f170: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
f180: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
f190: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
f1a0: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
f1b0: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
f1c0: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
f1d0: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
f1e0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
f1f0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
f200: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
f210: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
f220: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
f230: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
f240: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
f250: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
f260: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
f270: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
f280: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
f290: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
f2a0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
f2b0: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
f2c0: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
f2d0: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
f2e0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
f2f0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
f300: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
f310: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
f320: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
f330: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
f340: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
f350: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
f360: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
f370: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
f380: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
f390: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
f3a0: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
f3b0: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
f3c0: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
f3d0: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
f3e0: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
f3f0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
f400: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
f410: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
f420: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
f430: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
f440: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
f450: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
f460: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
f470: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
f480: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
f490: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
f4a0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
f4b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
f4c0: 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  nc || (pPager->j
f4d0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
f4e0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
f4f0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
f500: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
f510: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
f520: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
f530: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
f540: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
f550: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
f560: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
f570: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f580: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
f590: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f5a0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
f5b0: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
f5c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
f5d0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
f5e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f5f0: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
f600: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
f610: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
f620: 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  izer */ .  sqlit
f630: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
f640: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
f650: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
f660: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
f670: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f680: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f690: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
f6a0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
f6b0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
f6c0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
f6d0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
f6e0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f6f0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
f700: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
f710: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
f720: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
f730: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
f740: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
f750: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
f760: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f770: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
f780: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
f790: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
f7a0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
f7b0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f7c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
f7d0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
f7e0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
f7f0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
f800: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
f810: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
f820: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
f830: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
f840: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
f850: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
f860: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
f870: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
f880: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
f890: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
f8a0: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
f8b0: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
f8c0: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
f8d0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
f8e0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
f8f0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f900: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
f910: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
f920: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
f930: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
f940: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
f950: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
f960: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
f970: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
f980: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
f990: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
f9a0: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
f9b0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
f9c0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
f9d0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
f9e0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
f9f0: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
fa00: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
fa10: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
fa20: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
fa30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
fa40: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
fa50: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
fa60: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
fa70: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
fa80: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
fa90: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
faa0: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
fab0: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
fac0: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
fad0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
fae0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
faf0: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
fb00: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
fb10: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
fb20: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
fb30: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
fb40: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
fb50: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
fb60: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
fb70: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
fb80: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
fb90: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
fba0: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
fbb0: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
fbc0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
fbd0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
fbe0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
fbf0: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
fc00: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
fc10: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
fc20: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
fc30: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
fc40: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
fc50: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
fc60: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
fc70: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
fc80: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
fc90: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
fca0: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
fcb0: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
fcc0: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
fcd0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
fce0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
fcf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
fd00: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
fd10: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
fd20: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
fd30: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
fd40: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
fd50: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
fd60: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
fd70: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
fd80: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
fd90: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
fda0: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
fdb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fdc0: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
fdd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fde0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
fdf0: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
fe00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fe10: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
fe20: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
fe30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
fe40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
fe50: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
fe60: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
fe70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fe80: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
fe90: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
fea0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
feb0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
fec0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
fed0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
fee0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
fef0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ff00: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
ff10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ff20: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
ff30: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
ff40: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
ff50: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
ff60: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
ff70: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
ff80: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
ff90: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
ffa0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
ffb0: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
ffc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
ffd0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
ffe0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
fff0: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
10000 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
10010 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
10020 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
10030 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
10040 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
10050 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
10060 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
10070 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
10080 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
10090 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
100a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
100b0 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
100c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
100d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
100e0 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
100f0 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
10100 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
10110 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
10120 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
10130 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
10140 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
10150 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
10160 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
10170 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10180 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
10190 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
101a0 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
101b0 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
101c0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
101d0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
101e0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
101f0 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
10200 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
10210 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10220 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
10230 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
10240 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
10250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10260 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
10270 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
10280 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
10290 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
102a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
102b0 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
102c0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
102d0 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
102e0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10300 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
10310 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10320 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
10330 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
10340 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
10350 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
10360 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
10370 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
10380 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
10390 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
103a0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
103b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
103c0 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
103d0 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
103e0 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
103f0 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
10400 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
10410 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
10420 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
10430 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
10440 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
10450 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
10460 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
10470 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
10480 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
10490 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
104a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
104b0 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
104c0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
104d0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
104e0 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
104f0 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
10500 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
10510 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10520 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
10530 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
10540 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
10550 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
10560 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
10570 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
10580 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
10590 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
105a0 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
105b0 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
105c0 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
105d0 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
105e0 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
105f0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
10600 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
10610 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
10620 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
10630 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
10640 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
10650 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
10660 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
10670 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
10680 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
10690 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
106a0 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
106b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
106c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
106d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
106e0 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
106f0 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
10700 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
10710 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10720 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
10730 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
10740 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
10750 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
10760 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
10770 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
10780 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
10790 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
107a0 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
107b0 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
107c0 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
107d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
107e0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
107f0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
10800 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
10810 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
10820 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10830 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10840 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
10850 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
10860 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
10870 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10880 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
10890 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
108a0 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
108b0 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
108c0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
108d0 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
108e0 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
108f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10900 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
10910 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
10920 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
10930 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10940 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
10950 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
10960 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
10970 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
10980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
10990 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
109a0 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
109b0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
109c0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
109d0 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
109e0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
109f0 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
10a00 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
10a10 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
10a20 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10a30 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
10a40 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
10a50 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
10a60 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
10a70 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
10a80 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
10a90 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
10aa0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
10ab0 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66    /* Versions of
10ac0 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
10ad0 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70   3.5.8 set the p
10ae0 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
10af0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  f the.    ** jou
10b00 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a  rnal header to z
10b10 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
10b20 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
10b30 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  he Pager.pageSiz
10b40 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  e.    ** variabl
10b50 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  e is already set
10b60 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
10b70 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  page size..    *
10b80 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10b90 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
10ba0 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  iPageSize = pPag
10bb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
10bc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
10bd0 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
10be0 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
10bf0 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
10c00 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
10c10 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
10c20 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
10c30 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
10c40 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
10c50 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
10c60 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
10c70 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
10c80 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
10c90 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
10ca0 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
10cb0 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
10cc0 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
10cd0 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
10ce0 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
10cf0 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
10d00 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
10d10 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
10d20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
10d30 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
10d40 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
10d50 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
10d60 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
10d70 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
10d80 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
10d90 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
10da0 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
10db0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10dc0 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
10dd0 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
10de0 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
10df0 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
10e00 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
10e10 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
10e20 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
10e30 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10e40 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
10e50 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
10e60 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
10e70 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
10e80 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
10e90 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
10ea0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
10eb0 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
10ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10ed0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
10ee0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10ef0 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
10f00 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
10f10 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
10f20 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
10f30 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
10f40 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
10f50 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
10f60 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
10f70 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
10f80 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
10f90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
10fa0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
10fb0 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
10fc0 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
10fd0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
10fe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10ff0 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
11000 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
11010 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
11020 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
11030 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
11040 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
11050 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
11060 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
11070 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
11080 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
11090 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
110a0 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
110b0 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
110c0 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
110d0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
110e0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
110f0 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
11100 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
11110 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
11120 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
11130 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
11140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
11150 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
11160 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
11170 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
11180 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
11190 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
111a0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
111b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
111c0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
111d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
111e0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
111f0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
11200 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
11210 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
11220 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
11230 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
11240 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
11250 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
11260 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
11270 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
11280 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
11290 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
112a0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
112b0 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
112c0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
112d0 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
112e0 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
112f0 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
11300 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
11310 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
11320 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
11330 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
11340 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
11350 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
11360 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
11370 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
11380 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
11390 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
113a0 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
113b0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
113c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
113d0 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
113e0 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
113f0 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
11400 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
11410 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
11420 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
11430 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
11440 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
11450 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
11460 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
11470 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
11480 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
11490 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
114a0 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
114b0 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
114c0 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
114d0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
114e0 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
114f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
11500 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
11510 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
11520 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
11530 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
11540 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11560 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11570 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
11580 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
11590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
115a0 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
115b0 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
115c0 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
115e0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
115f0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
11600 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
11610 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
11620 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
11630 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
11640 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
11650 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11670 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
11680 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
11690 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
116a0 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
116b0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
116c0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
116d0 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
116e0 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
116f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
11700 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11710 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21  _MEMORY .   || !
11720 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
11730 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  fd).  ){.    ret
11740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11750 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
11760 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
11770 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
11780 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
11790 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
117a0 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
117b0 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20  e the length in 
117c0 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68  bytes and the ch
117d0 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65  ecksum of zMaste
117e0 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74  r */.  for(nMast
117f0 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d  er=0; zMaster[nM
11800 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b  aster]; nMaster+
11810 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
11820 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
11830 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
11840 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
11850 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
11860 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
11870 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
11880 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
11890 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
118a0 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
118b0 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
118c0 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
118d0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
118e0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
118f0 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
11900 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
11910 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
11920 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
11930 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
11940 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
11950 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
11960 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
11970 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
11980 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61  ter journal data
11990 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
119a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
119b0 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   If.  ** an erro
119c0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
119d0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
119e0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
119f0 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20   */.  if( (0 != 
11a00 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
11a10 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
11a20 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  HdrOff, PAGER_MJ
11a30 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29  _PGNO(pPager))))
11a40 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11a50 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
11a60 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
11a70 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c  Master, nMaster,
11a80 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20   iHdrOff+4))).  
11a90 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11aa0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11ab0 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11ac0 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73  +4+nMaster, nMas
11ad0 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  ter))).   || (0 
11ae0 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
11af0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
11b00 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
11b10 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a  ter+4, cksum))).
11b20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
11b30 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
11b40 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
11b50 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a  ournalMagic, 8,.
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b80 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
11b90 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
11ba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11bb0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11bc0 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
11bd0 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +20);..  /* If t
11be0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
11bf0 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
11c00 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
11c10 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
11c20 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
11c30 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
11c40 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
11c50 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
11c60 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
11c70 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
11c80 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
11c90 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
11ca0 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
11cb0 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
11cc0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
11cd0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
11ce0 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
11cf0 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
11d00 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
11d10 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
11d20 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
11d30 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
11d40 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
11d50 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
11d60 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
11d70 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
11d80 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
11d90 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
11da0 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
11db0 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
11dc0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
11dd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
11de0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
11df0 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
11e00 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
11e10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11e20 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
11e30 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
11e40 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
11e50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11e60 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
11e70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69   rc;.}../*.** Di
11e80 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65  scard the entire
11e90 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11ea0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d   in-memory page-
11eb0 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cache..*/.static
11ec0 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
11ed0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
11ee0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74  {.  pPager->iDat
11ef0 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71  aVersion++;.  sq
11f00 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
11f10 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
11f20 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  up);.  sqlite3Pc
11f30 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
11f40 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
11f50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11f60 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11f70 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33  sion value.*/.u3
11f80 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 61  2 sqlite3PagerDa
11f90 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20  taVersion(Pager 
11fa0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
11fb0 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  rn pPager->iData
11fc0 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  Version;.}../*.*
11fd0 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63  * Free all struc
11fe0 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67  tures in the Pag
11ff0 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  er.aSavepoint[] 
12000 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f  array and set bo
12010 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76  th.** Pager.aSav
12020 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72  epoint and Pager
12030 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a  .nSavepoint to z
12040 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73  ero. Close the s
12050 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66  ub-journal.** if
12060 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20   it is open and 
12070 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
12080 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
12090 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
120a0 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  id releaseAllSav
120b0 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70  epoints(Pager *p
120c0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69  Pager){.  int ii
120d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
120e0 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
120f0 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
12100 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
12110 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
12120 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
12130 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
12140 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
12150 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
12160 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
12170 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
12180 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
12190 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
121a0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49   sqlite3JournalI
121b0 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
121c0 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
121d0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
121e0 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
121f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12200 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
12210 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
12220 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
12230 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
12240 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
12250 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
12260 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
12270 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
12280 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
12290 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
122a0 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
122b0 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
122c0 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
122d0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
122e0 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
122f0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
12300 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
12310 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
12320 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
12330 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
12340 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
12350 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
12380 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
12390 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
123a0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
123b0 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
123c0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
123d0 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
123e0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
123f0 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
12400 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
12410 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
12420 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
12430 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
12440 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
12450 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
12460 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
12470 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
12480 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
12490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
124a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
124b0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
124c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
124d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
124e0 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a  T_CONCURRENT./*.
124f0 2a 2a 20 49 66 20 74 68 65 79 20 61 72 65 20 6e  ** If they are n
12500 6f 74 20 61 6c 72 65 61 64 79 2c 20 62 65 67 69  ot already, begi
12510 6e 20 72 65 63 6f 72 64 69 6e 67 20 61 6c 6c 20  n recording all 
12520 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
12530 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 0a  the pager layer.
12540 2a 2a 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ** by the b-tree
12550 20 6c 61 79 65 72 20 54 68 69 73 20 69 73 20 75   layer This is u
12560 73 65 64 20 62 79 20 63 6f 6e 63 75 72 72 65 6e  sed by concurren
12570 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  t transactions. 
12580 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
12590 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
125a0 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
125b0 65 72 72 6f 72 20 63 6f 64 65 20 28 53 51 4c 49  error code (SQLI
125c0 54 45 5f 4e 4f 4d 45 4d 29 20 69 66 20 61 6e 20  TE_NOMEM) if an 
125d0 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
125e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
125f0 61 67 65 72 42 65 67 69 6e 43 6f 6e 63 75 72 72  agerBeginConcurr
12600 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
12610 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
12620 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
12630 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
12640 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
12650 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d 20 73 71  r->pAllRead = sq
12660 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
12670 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
12680 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
12690 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
126a0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
126b0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
126c0 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Read==0 ){.     
126d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
126e0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
126f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12700 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12710 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
12720 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 70 20 72 65 63  ).**.** Stop rec
12730 6f 72 64 69 6e 67 20 61 6c 6c 20 70 61 67 65 73  ording all pages
12740 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
12750 61 67 65 72 20 6c 61 79 65 72 20 62 79 20 74 68  ager layer by th
12760 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 0a 2a  e b-tree layer.*
12770 2a 20 61 6e 64 20 64 69 73 63 61 72 64 20 61 6e  * and discard an
12780 79 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  y current record
12790 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
127a0 65 33 50 61 67 65 72 45 6e 64 43 6f 6e 63 75 72  e3PagerEndConcur
127b0 72 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  rent(Pager *pPag
127c0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69  er){.  sqlite3Bi
127d0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
127e0 65 72 2d 3e 70 41 6c 6c 52 65 61 64 29 3b 0a 20  er->pAllRead);. 
127f0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61   pPager->pAllRea
12800 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 21 64 65  d = 0;.}../* !de
12810 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12820 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a  T_CONCURRENT).**
12830 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
12840 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
12850 69 73 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e 20  is in wal mode. 
12860 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  False otherwise.
12870 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12880 61 67 65 72 49 73 57 61 6c 28 50 61 67 65 72 20  agerIsWal(Pager 
12890 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
128a0 72 6e 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 21  rn pPager->pWal!
128b0 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  =0;.}.#endif /* 
128c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
128d0 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  URRENT */../*.**
128e0 20 46 72 65 65 20 74 68 65 20 50 61 67 65 72 2e   Free the Pager.
128f0 70 49 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50  pInJournal and P
12900 61 67 65 72 2e 70 41 6c 6c 52 65 61 64 20 62 69  ager.pAllRead bi
12910 74 76 65 63 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  tvec objects..*/
12920 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12930 65 72 46 72 65 65 42 69 74 76 65 63 73 28 50 61  erFreeBitvecs(Pa
12940 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
12950 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
12960 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
12970 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
12980 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
12990 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   0;.  sqlite3Pag
129a0 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28  erEndConcurrent(
129b0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
129c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
129d0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
129e0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
129f0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
12a00 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
12a10 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
12a20 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
12a30 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
12a40 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
12a50 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
12a60 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
12a70 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
12a80 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
12a90 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
12aa0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
12ab0 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
12ac0 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
12ad0 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
12ae0 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
12af0 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
12b00 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
12b10 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
12b20 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
12b30 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
12b40 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
12b50 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
12b60 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
12b70 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
12b80 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
12b90 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
12ba0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12bb0 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
12bc0 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
12bd0 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
12be0 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
12bf0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
12c00 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12c10 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
12c20 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
12c30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
12c40 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
12c50 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
12c60 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
12c70 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
12c80 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
12c90 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
12ca0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
12cb0 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
12cc0 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
12cd0 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
12ce0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
12cf0 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
12d00 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
12d10 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
12d20 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
12d30 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
12d40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12d50 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
12d60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
12d70 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
12d80 29 3b 0a 0a 20 20 70 61 67 65 72 46 72 65 65 42  );..  pagerFreeB
12d90 69 74 76 65 63 73 28 70 50 61 67 65 72 29 3b 0a  itvecs(pPager);.
12da0 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
12db0 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
12dc0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
12dd0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
12de0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
12df0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
12e00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
12e10 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
12e20 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
12e30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12e40 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
12e50 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  N;.  }else if( !
12e60 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
12e70 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
12e80 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
12e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
12ea0 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
12eb0 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b  d by pagerUnlock
12ec0 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Db() */.    int 
12ed0 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61  iDc = isOpen(pPa
12ee0 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33  ger->fd)?sqlite3
12ef0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
12f00 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
12f10 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  fd):0;..    /* I
12f20 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
12f30 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64  system support d
12f40 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20  eletion of open 
12f50 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20  files, then.    
12f60 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ** close the jou
12f70 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
12f80 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
12f90 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65  base lock.  Othe
12fa0 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f  rwise.    ** ano
12fb0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
12fc0 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
12fd0 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64  e=delete might d
12fe0 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20  elete the file. 
12ff0 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75     ** out from u
13000 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
13010 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
13020 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
13030 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20  EMORY   & 5)!=1 
13040 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
13050 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13060 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21  E_OFF      & 5)!
13070 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
13080 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
13090 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20  MODE_WAL      & 
130a0 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
130b0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
130c0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
130d0 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
130e0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
130f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
13100 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ATE & 5)==1 );. 
13110 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
13120 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
13130 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29  RSIST  & 5)==1 )
13140 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44  ;.    if( 0==(iD
13150 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
13160 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
13170 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20  N_OPEN).     || 
13180 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  1!=(pPager->jour
13190 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20  nalMode & 5).   
131a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
131b0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
131c0 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
131d0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
131e0 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f  r is in the ERRO
131f0 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
13200 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  call to unlock t
13210 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
13220 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73  ** file fails, s
13230 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  et the current l
13240 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  ock to UNKNOWN_L
13250 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  OCK. See the com
13260 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76  ment.    ** abov
13270 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
13280 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  r UNKNOWN_LOCK f
13290 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
132a0 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  n of why this.  
132b0 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72    ** is necessar
132c0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  y..    */.    rc
132d0 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
132e0 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b  (pPager, NO_LOCK
132f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
13300 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
13310 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
13320 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  R_ERROR ){.     
13330 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
13340 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20   UNKNOWN_LOCK;. 
13350 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
13360 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79   pager state may
13370 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d   be changed from
13380 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20   PAGER_ERROR to 
13390 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a  PAGER_OPEN here.
133a0 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63      ** without c
133b0 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f  learing the erro
133c0 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  r code. This is 
133d0 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68  intentional - th
133e0 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63  e error.    ** c
133f0 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61  ode is cleared a
13400 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73  nd the cache res
13410 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  et in the block 
13420 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
13430 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13440 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
13450 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
13460 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20  ER_ERROR );.    
13470 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
13480 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
13490 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
134a0 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
134b0 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72  }..  /* If Pager
134c0 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
134d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
134e0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
134f0 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20   cannot be.  ** 
13500 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
13510 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  t there are no o
13520 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
13530 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
13540 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20  er,.  ** it can 
13550 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b  safely move back
13560 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   to PAGER_OPEN s
13570 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65  tate. This happe
13580 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20  ns in both.  ** 
13590 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75  normal and exclu
135a0 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
135b0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
135c0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
135d0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  e==SQLITE_OK || 
135e0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
135f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
13600 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
13610 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
13620 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
13630 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
13640 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
13650 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
13660 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
13670 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
13680 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  N;.    }else{.  
13690 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
136a0 74 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50 61  te = (isOpen(pPa
136b0 67 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45  ger->jfd) ? PAGE
136c0 52 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f 52  R_OPEN : PAGER_R
136d0 45 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20  EADER);.    }.  
136e0 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
136f0 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33  Pager) ) sqlite3
13700 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
13710 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->fd, 0, 0);.   
13720 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
13730 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13740 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
13750 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  d(pPager);.  }..
13760 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13770 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
13780 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
13790 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
137a0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
137b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
137c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
137d0 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
137e0 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
137f0 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
13800 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
13810 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
13820 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
13830 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
13840 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
13850 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
13860 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
13870 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
13880 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
13890 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
138a0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
138b0 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
138c0 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
138d0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
138e0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
138f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
13900 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
13910 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
13920 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
13930 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
13940 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
13950 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
13960 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
13970 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
13980 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
13990 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
139a0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
139b0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
139c0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
139d0 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
139e0 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
139f0 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
13a00 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
13a10 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
13a20 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
13a30 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
13a40 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
13a50 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
13a60 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
13a70 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
13a80 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
13a90 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
13aa0 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
13ab0 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
13ac0 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
13ad0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
13ae0 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
13af0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
13b00 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
13b10 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
13b20 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
13b30 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
13b40 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
13b50 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
13b60 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
13b70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
13b80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13b90 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
13ba0 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
13bb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13bc0 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
13bd0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
13be0 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
13bf0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
13c00 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
13c10 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
13c20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
13c30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
13c40 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
13c50 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
13c60 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
13c70 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
13c80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
13c90 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
13ca0 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
13cb0 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
13cc0 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
13cd0 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
13ce0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
13cf0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
13d00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
13d10 4f 52 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65  OR;.    setGette
13d20 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b  rMethod(pPager);
13d30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13d40 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
13d50 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
13d60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
13d70 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a  no nPage);../*.*
13d80 2a 20 54 68 65 20 77 72 69 74 65 20 74 72 61 6e  * The write tran
13d90 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20  saction open on 
13da0 70 50 61 67 65 72 20 69 73 20 62 65 69 6e 67 20  pPager is being 
13db0 63 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d  committed (bComm
13dc0 69 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c  it==1).** or rol
13dd0 6c 65 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69  led back (bCommi
13de0 74 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  t==0)..**.** Ret
13df0 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20  urn TRUE if and 
13e00 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69 72 74  only if all dirt
13e10 79 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62  y pages should b
13e20 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
13e30 6b 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a  k..**.** Rules:.
13e40 2a 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e  **.**   *  For n
13e50 6f 6e 2d 54 45 4d 50 20 64 61 74 61 62 61 73 65  on-TEMP database
13e60 73 2c 20 61 6c 77 61 79 73 20 73 79 6e 63 20 74  s, always sync t
13e70 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 69 73  o disk.  This is
13e80 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 20 20   necessary.**   
13e90 20 20 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69     for transacti
13ea0 6f 6e 73 20 74 6f 20 62 65 20 64 75 72 61 62 6c  ons to be durabl
13eb0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79  e..**.**   *  Sy
13ec0 6e 63 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  nc TEMP database
13ed0 20 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49   only on a COMMI
13ee0 54 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43  T (not a ROLLBAC
13ef0 4b 29 20 77 68 65 6e 20 74 68 65 20 62 61 63 6b  K) when the back
13f00 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  ing.**      file
13f10 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
13f20 64 20 61 6c 72 65 61 64 79 20 28 76 69 61 20 61  d already (via a
13f30 20 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53   spill on pagerS
13f40 74 72 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20  tress()) and.** 
13f50 20 20 20 20 20 77 68 65 6e 20 74 68 65 20 6e 75       when the nu
13f60 6d 62 65 72 20 6f 66 20 64 69 72 74 79 20 70 61  mber of dirty pa
13f70 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78  ges in memory ex
13f80 63 65 65 64 73 20 32 35 25 20 6f 66 20 74 68 65  ceeds 25% of the
13f90 20 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63   total.**      c
13fa0 61 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  ache size..*/.st
13fb0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 46 6c  atic int pagerFl
13fc0 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65  ushOnCommit(Page
13fd0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 62  r *pPager, int b
13fe0 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20 70  Commit){.  if( p
13ff0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
14000 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
14010 20 69 66 28 20 21 62 43 6f 6d 6d 69 74 20 29 20   if( !bCommit ) 
14020 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
14030 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
14040 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  fd) ) return 0;.
14050 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65    return (sqlite
14060 33 50 43 61 63 68 65 50 65 72 63 65 6e 74 44 69  3PCachePercentDi
14070 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
14080 63 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a  che)>=25);.}../*
14090 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
140a0 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
140b0 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
140c0 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
140d0 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
140e0 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
140f0 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
14100 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
14110 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
14120 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
14130 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
14140 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
14150 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
14160 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
14170 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
14180 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
14190 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
141a0 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
141b0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
141c0 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  n..** .** This r
141d0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
141e0 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f  called in PAGER_
141f0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20  ERROR state. If 
14200 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  it is called.** 
14210 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72  in PAGER_NONE or
14220 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
14230 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ate and the lock
14240 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a   held is less.**
14250 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20   exclusive than 
14260 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  a RESERVED lock,
14270 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
14280 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
14290 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
142a0 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
142b0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
142c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
142d0 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
142e0 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
142f0 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
14300 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
14310 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
14320 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
14330 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
14340 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
14350 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
14360 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
14370 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
14380 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
14390 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
143a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
143b0 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
143c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
143d0 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
143e0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
143f0 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
14400 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
14410 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
14420 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
14430 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
14440 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
14450 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
14460 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
14470 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
14480 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
14490 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
144a0 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
144b0 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
144c0 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
144d0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
144e0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
144f0 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
14500 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
14510 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
14520 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
14530 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
14540 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
14550 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
14560 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
14570 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
14580 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
14590 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
145a0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
145b0 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
145c0 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
145d0 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
145e0 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
145f0 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
14600 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
14610 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
14620 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
14630 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
14640 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
14650 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
14660 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
14670 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
14680 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
14690 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
146a0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
146b0 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
146c0 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
146d0 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
146e0 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
146f0 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
14700 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
14710 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
14720 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
14730 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
14740 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
14750 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
14760 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
14770 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
14780 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
14790 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
147a0 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
147b0 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  ized, the pager 
147c0 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52  moves to PAGER_R
147d0 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20  EADER state..** 
147e0 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  If running in no
147f0 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c  n-exclusive roll
14800 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c  back mode, the l
14810 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
14820 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65  is .** downgrade
14830 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f  d to a SHARED_LO
14840 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
14850 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
14860 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
14870 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
14880 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a  occurs during.**
14890 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f   any of the IO o
148a0 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e  perations to fin
148b0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
148c0 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b  l file or unlock
148d0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
148e0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
148f0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14900 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
14910 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72   If the .** oper
14920 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a  ation to finaliz
14930 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
14940 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  le fails, then t
14950 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a  he code still.**
14960 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b   tries to unlock
14970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14980 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63  le if not in exc
14990 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20  lusive mode. If 
149a0 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70  the.** unlock op
149b0 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73  eration fails as
149c0 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   well, then the 
149d0 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65  first error code
149e0 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74   related.** to t
149f0 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65  he first error e
14a00 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20  ncountered (the 
14a10 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
14a20 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20  tion one) is.** 
14a30 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
14a40 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
14a50 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
14a60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
14a70 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20   hasMaster, int 
14a80 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20  bCommit){.  int 
14a90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
14aa0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
14ab0 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
14ac0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
14ad0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
14ae0 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
14af0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
14b00 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
14b10 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
14b20 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
14b30 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
14b40 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
14b50 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
14b60 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
14b70 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
14b80 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
14b90 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
14ba0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
14bb0 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
14bc0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
14bd0 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
14be0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
14bf0 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
14c00 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
14c10 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
14c20 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
14c30 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
14c40 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
14c50 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
14c60 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
14c70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
14c80 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
14c90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
14ca0 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
14cb0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
14cc0 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
14cd0 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
14ce0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
14cf0 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
14d00 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
14d10 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
14d20 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
14d30 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
14d40 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
14d50 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
14d60 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
14d70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
14d80 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
14d90 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
14da0 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
14db0 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
14dc0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
14dd0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
14de0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14df0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
14e00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
14e10 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
14e20 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
14e30 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
14e40 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
14e50 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
14e60 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
14e70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14e80 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
14e90 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
14ea0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
14eb0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
14ec0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
14ed0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
14ee0 30 20 0a 20 20 20 20 20 20 7c 7c 20 28 73 71 6c  0 .      || (sql
14ef0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
14f00 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
14f10 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
14f20 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
14f30 43 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 73  C).  );.  if( is
14f40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
14f50 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
14f60 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
14f70 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
14f80 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   Finalize the jo
14f90 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
14fa0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f     if( sqlite3Jo
14fb0 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28  urnalIsInMemory(
14fc0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
14fd0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
14fe0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14ff0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
15000 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
15010 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
15020 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
15030 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
15040 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
15050 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
15060 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
15070 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  NCATE ){.      i
15080 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
15090 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
150a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
150b0 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
150c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
150d0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
150e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
150f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
15100 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
15110 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
15120 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  {.          /* M
15130 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
15140 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72   file size is wr
15150 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
15160 6e 6f 64 65 20 72 69 67 68 74 20 61 77 61 79 2e  node right away.
15170 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  .          ** Ot
15180 68 65 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72  herwise the jour
15190 6e 61 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72  nal might resurr
151a0 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20  ect following a 
151b0 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20  power loss and. 
151c0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73           ** caus
151d0 65 20 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73  e the last trans
151e0 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62  action to roll b
151f0 61 63 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20  ack.  See.      
15200 20 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62      ** https://b
15210 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e  ugzilla.mozilla.
15220 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69  org/show_bug.cgi
15230 3f 69 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20  ?id=1072773.    
15240 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15250 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15260 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
15270 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
15280 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d  lags);.        }
15290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
152a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
152b0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
152c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
152d0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
152e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
152f0 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  IST.      || (pP
15300 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
15310 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ode && pPager->j
15320 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
15330 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
15340 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  L).    ){.      
15350 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
15360 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
15370 61 73 74 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74  aster||pPager->t
15380 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
15390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
153a0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
153b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
153c0 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
153d0 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
153e0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
153f0 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
15400 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
15410 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
15420 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
15430 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
15440 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
15450 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
15460 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
15470 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
15480 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
15490 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
154a0 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
154b0 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
154c0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20  emory journal.. 
154d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
154e0 74 20 62 44 65 6c 65 74 65 20 3d 20 21 70 50 61  t bDelete = !pPa
154f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
15500 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
15510 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
15520 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  emory(pPager->jf
15530 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  d)==0 );.      a
15540 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
15550 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
15560 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
15570 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20  LETE .          
15580 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
15590 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
155a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
155b0 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y .           ||
155c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
155d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
155e0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
155f0 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
15600 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
15610 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
15620 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20  f( bDelete ){.  
15630 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15640 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
15650 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
15660 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
15670 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a 20  r->extraSync);. 
15680 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15690 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
156a0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71  CHECK_PAGES.  sq
156b0 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
156c0 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
156d0 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73  pPCache, pager_s
156e0 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20  et_pagehash);.  
156f0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
15700 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  ze==0 && sqlite3
15710 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
15720 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
15730 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  0 ){.    PgHdr *
15740 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
15750 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31  Lookup(pPager, 1
15760 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
15770 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73        p->pageHas
15780 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  h = 0;.      sql
15790 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
157a0 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a  tNull(p);.    }.
157b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 61    }.#endif..  pa
157c0 67 65 72 46 72 65 65 42 69 74 76 65 63 73 28 70  gerFreeBitvecs(p
157d0 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
157e0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
157f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15800 29 7b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  ){.    if( MEMDB
15810 20 7c 7c 20 70 61 67 65 72 46 6c 75 73 68 4f 6e   || pagerFlushOn
15820 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 2c 20 62  Commit(pPager, b
15830 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 20  Commit) ){.     
15840 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
15850 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
15860 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 65 6c  PCache);.    }el
15870 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
15880 33 50 63 61 63 68 65 43 6c 65 61 72 57 72 69 74  3PcacheClearWrit
15890 61 62 6c 65 28 70 50 61 67 65 72 2d 3e 70 50 43  able(pPager->pPC
158a0 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ache);.    }.   
158b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
158c0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
158d0 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
158e0 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  dbSize);.  }..  
158f0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
15900 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
15910 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77  * Drop the WAL w
15920 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e  rite-lock, if an
15930 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  y. Also, if the 
15940 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69  connection was i
15950 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e  n .    ** lockin
15960 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
15970 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20   mode but is no 
15980 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65  longer, drop the
15990 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20   EXCLUSIVE .    
159a0 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ** lock held on 
159b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
159c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
159d0 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  2 = sqlite3WalEn
159e0 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  dWriteTransactio
159f0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
15a00 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 32  .    assert( rc2
15a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
15a20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
15a30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d  QLITE_OK && bCom
15a40 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e 64  mit && pPager->d
15a50 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65 72  bFileSize>pPager
15a60 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
15a70 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
15a80 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f 6d  s taken when com
15a90 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
15aa0 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61 63  ction in rollbac
15ab0 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  k-journal.    **
15ac0 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61 74   mode if the dat
15ad0 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
15ae0 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  sk is larger tha
15af0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
15b00 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74 20  mage..    ** At 
15b10 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 6a  this point the j
15b20 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
15b30 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74 68  finalized and th
15b40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
15b50 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
15b60 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62 75  ly committed, bu
15b70 74 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  t the EXCLUSIVE 
15b80 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68 65  lock is still he
15b90 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ld on the.    **
15ba0 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73 20   file. So it is 
15bb0 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74 65  safe to truncate
15bc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15bd0 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  le to its minimu
15be0 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  m.    ** require
15bf0 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20  d size.  */.    
15c00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15c10 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
15c20 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  _LOCK );.    rc 
15c30 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
15c40 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
15c50 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
15c60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15c70 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 29 7b  OK && bCommit ){
15c80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15c90 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
15ca0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
15cb0 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50  E_FCNTL_COMMIT_P
15cc0 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20  HASETWO, 0);.   
15cd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15ce0 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
15cf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
15d00 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
15d10 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
15d20 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61   && (!pagerUseWa
15d30 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c  l(pPager) || sql
15d40 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
15d50 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
15d60 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20  l, 0)).  ){.    
15d70 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63  rc2 = pagerUnloc
15d80 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
15d90 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
15da0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
15db0 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  tDone = 0;.  }. 
15dc0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
15dd0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
15de0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
15df0 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  ter = 0;..  retu
15e00 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
15e10 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
15e20 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
15e30 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
15e40 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
15e50 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
15e60 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
15e70 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
15e80 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
15e90 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
15ea0 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20  ERROR state, do 
15eb0 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
15ec0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
15ed0 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
15ee0 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
15ef0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
15f00 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
15f10 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
15f20 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
15f30 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
15f40 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
15f50 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f  base file and mo
15f60 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63  ve the pager bac
15f70 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
15f80 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61   If this .** mea
15f90 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
15fa0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c   a hot-journal l
15fb0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
15fc0 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74  system, the next
15fd0 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
15fe0 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
15ff0 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  ed lock on the p
16000 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20  ager (which may 
16010 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a  be this one) .**
16020 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61   will roll it ba
16030 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
16040 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
16050 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
16060 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
16070 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
16080 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
16090 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
160a0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
160b0 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
160c0 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
160d0 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
160e0 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68  ROR state. Which
160f0 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
16100 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
16110 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
16120 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
16130 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
16140 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
16150 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
16160 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
16170 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
16180 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
16190 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
161a0 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  !=PAGER_OPEN ){.
161b0 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
161c0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
161d0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66  Pager) );.    if
161e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
161f0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
16200 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73  OCKED ){.      s
16210 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
16220 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
16230 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
16240 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
16250 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
16260 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
16270 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
16280 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
16290 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ode ){.      ass
162a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
162b0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
162c0 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  R );.      pager
162d0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
162e0 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
162f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65      }.  }.  page
16300 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
16310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
16320 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20  eter aData must 
16330 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
16340 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67  r of pPager->pag
16350 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f  eSize bytes.** o
16360 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20  f data. Compute 
16370 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
16380 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20  cksum based ont 
16390 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
163a0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20  the .** page of 
163b0 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72  data and the cur
163c0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50  rent value of pP
163d0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e  ager->cksumInit.
163e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
163f0 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
16400 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79  um. It is really
16410 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
16420 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
16430 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70  initial value (p
16440 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
16450 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74  ) and every 200t
16460 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65  h byte.** of the
16470 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72   page data, star
16480 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f  ting with byte o
16490 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70  ffset (pPager->p
164a0 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a  ageSize%200)..**
164b0 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   Each byte is in
164c0 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
164d0 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  8-bit unsigned i
164e0 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68  nteger..**.** Ch
164f0 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75  anging the formu
16500 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  la used to compu
16510 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d  te this checksum
16520 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a   results in an.*
16530 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a  * incompatible j
16540 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
16550 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75  at..**.** If jou
16560 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
16570 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
16580 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
16590 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a  he most likely .
165a0 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  ** scenario is t
165b0 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
165c0 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
165d0 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
165e0 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69  hanged. .** It i
165f0 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  s much less like
16600 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
16610 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
16620 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
16630 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
16640 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
16650 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
16660 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
16670 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
16680 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
16690 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
166a0 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
166b0 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
166c0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
166d0 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
166e0 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
166f0 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
16700 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
16710 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  ->cksumInit;    
16720 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
16730 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
16740 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50   */.  int i = pP
16750 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
16760 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  00;          /* 
16770 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
16780 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
16790 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
167a0 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
167b0 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
167c0 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
167d0 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
167e0 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61  rent page size a
167f0 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  nd number of res
16800 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b  erved bytes back
16810 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63  .** to the codec
16820 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
16830 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61  TE_HAS_CODEC.sta
16840 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
16850 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a  portSize(Pager *
16860 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
16870 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
16880 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61  eChng ){.    pPa
16890 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
168a0 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  hng(pPager->pCod
168b0 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ec, pPager->page
168c0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52   (int)pPager->nR
168f0 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23  eserve);.  }.}.#
16900 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
16910 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29  gerReportSize(X)
16920 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66       /* No-op if
16930 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
16940 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65  rt a codec */.#e
16950 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
16960 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
16970 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
16980 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
16990 72 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65  rved bits is the
169a0 20 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73   same in the des
169b0 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65  tination.** page
169c0 72 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68  r as it is in th
169d0 65 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20  e source.  This 
169e0 63 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20  comes up when a 
169f0 56 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74  VACUUM changes t
16a00 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
16a10 72 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f  reserved bits to
16a20 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61   the "optimal" a
16a30 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mount..*/.void s
16a40 71 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e  qlite3PagerAlign
16a50 52 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70  Reserve(Pager *p
16a60 44 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72  Dest, Pager *pSr
16a70 63 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d  c){.  if( pDest-
16a80 3e 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d  >nReserve!=pSrc-
16a90 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20  >nReserve ){.   
16aa0 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
16ab0 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76   = pSrc->nReserv
16ac0 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
16ad0 72 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20  rtSize(pDest);. 
16ae0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
16af0 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
16b00 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
16b10 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
16b20 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
16b30 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
16b40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16b50 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
16b60 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
16b70 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
16b80 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
16b90 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
16ba0 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
16bb0 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
16bc0 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
16bd0 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
16be0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
16bf0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
16c00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
16c10 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
16c20 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73  l uses checksums
16c30 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74   - the statement
16c40 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a   journal does .*
16c50 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  * not..**.** If 
16c60 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
16c70 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  of the page reco
16c80 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
16c90 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
16ca0 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
16cb0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
16cc0 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
16cd0 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70  r.dbSize, then p
16ce0 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b  layback is.** sk
16cf0 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45  ipped and SQLITE
16d00 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
16d10 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20  .**.** If pDone 
16d20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
16d30 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64  n it is a record
16d40 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
16d50 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  ave already.** b
16d60 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  een played back.
16d70 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74    If the page at
16d80 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c   *pOffset has al
16d90 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
16da0 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68  d back.** (if th
16db0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
16dc0 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74  pDone bit is set
16dd0 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
16de0 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b  playback..** Mak
16df0 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65  e sure the pDone
16e00 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
16e10 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73  ng to the *pOffs
16e20 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a  et page is set.*
16e30 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72  * prior to retur
16e40 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ning..**.** If t
16e50 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  he page record i
16e60 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
16e70 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
16e80 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
16e90 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61  ** and played ba
16ea0 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ck, then SQLITE_
16eb0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
16ec0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
16ed0 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72  ccurs.** while r
16ee0 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72  eading the recor
16ef0 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16f00 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  )journal file or
16f10 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a   while writing.*
16f20 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
16f30 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
16f40 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
16f50 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64  s returned. If d
16f60 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  ata.** is succes
16f70 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
16f80 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
16f90 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65  al file but appe
16fa0 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72  ars to be.** cor
16fb0 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
16fc0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
16fd0 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65   Data is conside
16fe0 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e  red corrupted in
16ff0 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74  .** two circumst
17000 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ances:.** .**   
17010 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
17020 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69  page-number is i
17030 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47  llegal (0 or PAG
17040 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a  ER_MJ_PGNO), or.
17050 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
17060 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f  cord is being ro
17070 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  lled back from t
17080 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
17090 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20  file.**     and 
170a0 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65  the checksum fie
170b0 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ld does not matc
170c0 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  h the record con
170d0 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74  tent..**.** Neit
170e0 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f  her of these two
170f0 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70   scenarios are p
17100 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61  ossible during a
17110 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
17120 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
17130 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  is is a savepoin
17140 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  t rollback, then
17150 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65   memory may have
17160 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
17170 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
17180 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
17190 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
171a0 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c   case and an all
171b0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
171c0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
171d0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
171e0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
171f0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
17200 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
17210 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
17220 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
17230 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
17240 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66  k */.  i64 *pOff
17250 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
17260 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
17270 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79  f record to play
17280 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
17290 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20   *pDone,        
172a0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
172b0 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
172c0 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
172d0 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72  /.  int isMainJr
172e0 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nl,             
172f0 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a    /* 1 -> main j
17300 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62  ournal. 0 -> sub
17310 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69  -journal. */.  i
17320 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20  nt isSavepnt    
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17340 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70  True for a savep
17350 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  oint rollback */
17360 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
17370 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17390 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
173a0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
173b0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173d0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
173e0 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
173f0 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
17400 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17420 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
17430 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
17440 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61  g */.  char *aDa
17450 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
17460 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
17470 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
17480 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
17490 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
174a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
174b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
174c0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
174d0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
174e0 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  sSynced;        
174f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
17500 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65   if journal page
17510 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69   is synced */.#i
17520 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
17530 43 4f 44 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a  CODEC.  /* The j
17540 72 6e 6c 45 6e 63 20 66 6c 61 67 20 69 73 20 74  rnlEnc flag is t
17550 72 75 65 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70  rue if Journal p
17560 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70  ages should be p
17570 61 73 73 65 64 20 74 68 72 6f 75 67 68 0a 20 20  assed through.  
17580 2a 2a 20 74 68 65 20 63 6f 64 65 63 2e 20 20 49  ** the codec.  I
17590 74 20 69 73 20 66 61 6c 73 65 20 66 6f 72 20 70  t is false for p
175a0 75 72 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  ure in-memory jo
175b0 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e  urnals. */.  con
175c0 73 74 20 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d  st int jrnlEnc =
175d0 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20   (isMainJrnl || 
175e0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
175f0 6d 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66  mory==0);.#endif
17600 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
17610 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
17620 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
17630 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
17640 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
17650 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
17660 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
17670 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
17680 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
17690 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
176a0 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
176b0 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
176c0 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
176d0 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
176e0 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
176f0 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
17700 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
17710 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
17720 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
17730 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
17740 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
17750 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
17760 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
17770 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
17780 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
17790 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
177a0 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
177b0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
177c0 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
177d0 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65  Either the state
177e0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
177f0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
17800 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61  CHEMOD (a transa
17810 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73  ction .  ** or s
17820 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
17830 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65  k done at the re
17840 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c  quest of the cal
17850 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a  ler) or this is.
17860 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
17870 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20  al rollback. If 
17880 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  it is a hot-jour
17890 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  nal rollback, th
178a0 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20  e pager.  ** is 
178b0 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e  in state OPEN an
178c0 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55  d holds an EXCLU
178d0 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a  SIVE lock. Hot-j
178e0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
178f0 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20    ** only reads 
17900 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
17910 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73  urnal, not the s
17920 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ub-journal..  */
17930 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17940 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
17950 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
17960 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
17970 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
17980 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
17990 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
179a0 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20  VE_LOCK).  );.  
179b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
179c0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
179d0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c  ITER_CACHEMOD ||
179e0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a   isMainJrnl );..
179f0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
17a00 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
17a10 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
17a20 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
17a30 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
17a40 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
17a50 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
17a60 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
17a70 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
17a80 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
17a90 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
17aa0 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
17ab0 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
17ac0 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
17ad0 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
17ae0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17af0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
17b00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
17b10 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
17b20 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17b30 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
17b40 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
17b50 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17b60 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
17b70 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
17b80 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
17b90 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
17ba0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
17bb0 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
17bc0 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
17bd0 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
17be0 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
17bf0 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
17c00 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
17c10 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
17c20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
17c30 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
17c40 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
17c50 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
17c60 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
17c70 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
17c80 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
17c90 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
17ca0 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
17cb0 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
17cc0 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
17cd0 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
17ce0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
17cf0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
17d00 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
17d10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17d20 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
17d30 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
17d40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
17d50 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
17d60 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
17d70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17d80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17d90 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
17da0 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
17db0 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
17dc0 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
17dd0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
17de0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
17df0 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17e00 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
17e10 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
17e20 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
17e30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
17e40 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
17e50 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
17e60 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
17e70 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65  n played back be
17e80 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20  fore during the 
17e90 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  current.  ** rol
17ea0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27  lback, then don'
17eb0 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79  t bother to play
17ec0 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a   it back again..
17ed0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65    */.  if( pDone
17ee0 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
17ef0 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
17f00 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
17f10 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17f20 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
17f30 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
17f40 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72  k page 1, restor
17f50 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  e the nReserve s
17f60 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66  etting.  */.  if
17f70 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ( pgno==1 && pPa
17f80 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28  ger->nReserve!=(
17f90 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20  (u8*)aData)[20] 
17fa0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
17fb0 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29  Reserve = ((u8*)
17fc0 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20  aData)[20];.    
17fd0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
17fe0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
17ff0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
18000 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73  is in CACHEMOD s
18010 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
18020 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
18030 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
18040 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
18050 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
18060 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
18070 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
18080 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
18090 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
180a0 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
180b0 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
180c0 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
180d0 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
180e0 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
180f0 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
18100 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
18110 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
18120 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
18130 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
18140 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
18150 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
18160 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
18170 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
18180 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
18190 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
181a0 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
181b0 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
181c0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
181d0 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
181e0 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
181f0 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
18200 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
18210 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
18220 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
18230 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
18240 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
18250 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c  in WRITER_DBMOD,
18260 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
18270 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
18280 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
18290 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61  he.  ** pager ca
182a0 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
182b0 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
182c0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
182d0 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a  then marked .  *
182e0 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e  * not dirty. Sin
182f0 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  ce this code is 
18300 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e  only executed in
18310 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
18320 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74  e for.  ** a hot
18330 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
18340 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  k, it is guarant
18350 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  eed that the pag
18360 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79  e-cache is empty
18370 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67  .  ** if the pag
18380 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74  er is in OPEN st
18390 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ate..  **.  ** T
183a0 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
183b0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
183c0 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
183d0 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
183e0 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
183f0 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
18400 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
18410 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
18420 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
18430 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
18440 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
18450 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
18460 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
18470 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
18480 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
18490 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
184a0 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
184b0 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
184c0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
184d0 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
184e0 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
184f0 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
18500 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
18510 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
18520 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
18530 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
18540 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
18550 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
18560 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
18570 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
18580 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
18590 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
185a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
185b0 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
185c0 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
185d0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
185e0 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
185f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
18600 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
18610 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
18620 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
18630 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
18640 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
18650 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
18660 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
18670 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
18680 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
18690 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
186a0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
186b0 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
186c0 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
186d0 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
186e0 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
186f0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
18700 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
18710 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
18720 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
18730 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
18740 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
18750 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
18760 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
18770 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
18780 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
18790 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
187a0 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
187b0 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
187c0 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
187d0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
187e0 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
187f0 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
18800 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
18810 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
18820 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
18830 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
18840 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  se{.    pPg = sq
18850 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
18860 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
18870 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
18880 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
18890 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
188a0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
188b0 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c  PEN || pPg==0 ||
188c0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
188d0 65 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  e );.  PAGERTRAC
188e0 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
188f0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
18900 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
18910 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
18920 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
18930 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
18940 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
18950 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
18960 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
18970 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
18980 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
18990 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
189a0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
189b0 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
189c0 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
189d0 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
189e0 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
189f0 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
18a00 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
18a10 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
18a20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
18a30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
18a40 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
18a50 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
18a60 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
18a70 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
18a80 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
18a90 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
18aa0 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
18ab0 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
18ac0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
18ad0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
18ae0 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
18af0 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
18b00 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
18b10 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
18b20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18b30 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
18b40 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
18b50 20 57 72 69 74 65 20 74 68 65 20 64 61 74 61 20   Write the data 
18b60 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
18b70 75 72 6e 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20  urnal back into 
18b80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18b90 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  e..    ** This i
18ba0 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 20 65  s usually safe e
18bb0 76 65 6e 20 66 6f 72 20 61 6e 20 65 6e 63 72 79  ven for an encry
18bc0 70 74 65 64 20 64 61 74 61 62 61 73 65 20 2d 20  pted database - 
18bd0 61 73 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  as the data.    
18be0 2a 2a 20 77 61 73 20 65 6e 63 72 79 70 74 65 64  ** was encrypted
18bf0 20 62 65 66 6f 72 65 20 69 74 20 77 61 73 20 77   before it was w
18c00 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
18c10 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
18c20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a  exception.    **
18c30 20 69 73 20 69 66 20 74 68 65 20 64 61 74 61 20   is if the data 
18c40 77 61 73 20 6a 75 73 74 20 72 65 61 64 20 66 72  was just read fr
18c50 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  om an in-memory 
18c60 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  sub-journal. In 
18c70 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 73 65  that.    ** case
18c80 20 69 74 20 6d 75 73 74 20 62 65 20 65 6e 63 72   it must be encr
18c90 79 70 74 65 64 20 68 65 72 65 20 62 65 66 6f 72  ypted here befor
18ca0 65 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  e it is copied i
18cb0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
18cc0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a  .    ** file.  *
18cd0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
18ce0 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66  HAS_CODEC.    if
18cf0 28 20 21 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20  ( !jrnlEnc ){.  
18d00 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
18d10 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
18d20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
18d30 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61 29 3b  EM_BKPT, aData);
18d40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18d50 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
18d60 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61  r->fd, (u8 *)aDa
18d70 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
18d80 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
18d90 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
18da0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  , aData, pgno, 3
18db0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18dc0 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c  M_BKPT);.    }el
18dd0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63  se.#endif.    rc
18de0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
18df0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
18e00 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  8 *)aData, pPage
18e10 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
18e20 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 67 6e  t);..    if( pgn
18e30 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
18e40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
18e50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
18e60 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
18e70 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
18e80 42 61 63 6b 75 70 20 29 7b 0a 23 69 66 64 65 66  Backup ){.#ifdef
18e90 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
18ea0 43 0a 20 20 20 20 20 20 69 66 28 20 6a 72 6e 6c  C.      if( jrnl
18eb0 45 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 43  Enc ){.        C
18ec0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
18ed0 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
18ee0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
18ef0 50 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  PT);.        sql
18f00 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
18f10 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
18f20 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
18f30 74 61 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  ta);.        COD
18f40 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
18f50 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
18f60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
18f70 2c 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  ,aData);.      }
18f80 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
18f90 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
18fa0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
18fb0 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
18fc0 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  *)aData);.    }.
18fd0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
18fe0 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
18ff0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
19000 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
19010 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
19020 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
19030 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
19040 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
19050 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
19060 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
19070 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
19080 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
19090 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
190a0 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
190b0 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
190c0 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
190d0 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
190e0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
190f0 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
19100 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
19110 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
19120 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
19130 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
19140 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
19150 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
19160 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
19170 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
19180 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
19190 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
191a0 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
191b0 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
191c0 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
191d0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
191e0 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
191f0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
19200 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
19210 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
19220 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
19230 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
19240 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
19250 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
19260 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
19270 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
19280 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
19290 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
192a0 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
192b0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
192c0 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
192d0 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
192e0 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
192f0 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
19300 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
19310 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
19320 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
19330 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
19340 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
19350 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
19360 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
19370 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73  vepnt );.    ass
19380 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f  ert( (pPager->do
19390 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
193a0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d  FLAG_ROLLBACK)==
193b0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
193c0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
193d0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
193e0 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  K;.    rc = sqli
193f0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
19400 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
19410 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
19420 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
19430 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
19440 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a  ROLLBACK)!=0 );.
19450 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
19460 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
19470 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
19480 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19490 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
194a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
194b0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
194c0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
194d0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
194e0 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
194f0 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
19500 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
19510 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
19520 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
19530 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
19540 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
19550 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
19560 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
19570 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
19580 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
19590 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
195a0 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
195b0 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
195c0 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
195d0 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
195e0 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
195f0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
19600 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
19610 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
19620 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
19630 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
19640 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
19650 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
19660 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
19670 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
19680 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
19690 20 2f 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62   /* It used to b
196a0 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 63  e that sqlite3Pc
196b0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
196c0 67 29 20 77 61 73 20 63 61 6c 6c 65 64 20 68 65  g) was called he
196d0 72 65 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  re.  But.    ** 
196e0 74 68 61 74 20 63 61 6c 6c 20 77 61 73 20 64 61  that call was da
196f0 6e 67 65 72 6f 75 73 20 61 6e 64 20 68 61 64 20  ngerous and had 
19700 6e 6f 20 64 65 74 65 63 74 61 62 6c 65 20 62 65  no detectable be
19710 6e 65 66 69 74 20 73 69 6e 63 65 20 74 68 65 20  nefit since the 
19720 63 61 63 68 65 0a 20 20 20 20 2a 2a 20 69 73 20  cache.    ** is 
19730 6e 6f 72 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64  normally cleaned
19740 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
19750 65 43 6c 65 61 6e 41 6c 6c 28 29 20 61 66 74 65  eCleanAll() afte
19760 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  r rollback and s
19770 6f 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  o.    ** has bee
19780 6e 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20  n removed. */.  
19790 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
197a0 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20  hash(pPg);..    
197b0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
197c0 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
197d0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
197e0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
197f0 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
19800 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
19810 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
19820 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
19830 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
19840 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
19850 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
19860 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
19870 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
19880 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
19890 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
198a0 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
198b0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  */.#if SQLITE_HA
198c0 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20  S_CODEC.    if( 
198d0 6a 72 6e 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43  jrnlEnc ){ CODEC
198e0 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
198f0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
19900 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
19910 4b 50 54 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20  KPT); }.#endif. 
19920 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
19930 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
19940 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19950 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
19960 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
19970 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
19980 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
19990 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
199a0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
199b0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
199c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
199d0 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
199e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
199f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
19a00 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
19a10 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
19a20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19a30 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
19a40 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
19a50 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
19a60 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
19a70 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
19a80 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
19a90 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
19aa0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
19ab0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
19ac0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
19ad0 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
19ae0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
19af0 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
19b00 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
19b10 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
19b20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
19b30 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
19b40 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
19b50 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
19b60 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
19b70 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
19b80 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
19b90 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
19ba0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
19bb0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
19bc0 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
19bd0 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
19be0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
19bf0 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
19c00 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
19c10 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
19c20 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
19c30 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
19c40 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
19c50 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
19c60 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
19c70 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
19c80 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
19c90 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
19ca0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
19cb0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
19cc0 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
19cd0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
19ce0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
19cf0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
19d00 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
19d10 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
19d20 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
19d30 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
19d40 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
19d50 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
19d60 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
19d70 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
19d80 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
19d90 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
19da0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
19db0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
19dc0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
19dd0 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
19de0 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
19df0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
19e00 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
19e10 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
19e20 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
19e30 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
19e40 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
19e50 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
19e60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
19e70 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
19e80 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
19e90 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
19ea0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
19eb0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
19ec0 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
19ed0 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
19ee0 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
19ef0 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
19f00 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
19f10 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
19f20 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
19f30 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
19f40 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
19f50 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
19f60 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
19f70 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
19f80 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
19f90 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
19fa0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
19fb0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
19fc0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
19fd0 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
19fe0 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
19ff0 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
1a000 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1a010 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
1a020 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
1a030 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
1a040 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
1a050 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
1a060 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
1a070 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a080 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
1a090 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
1a0a0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
1a0b0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
1a0c0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
1a0d0 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
1a0e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1a0f0 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
1a100 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
1a110 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
1a120 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1a130 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1a140 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1a170 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
1a180 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
1a190 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
1a1a0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
1a1b0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
1a1c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
1a1d0 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
1a1e0 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
1a1f0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
1a200 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
1a210 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
1a220 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
1a230 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a240 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
1a250 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
1a260 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
1a270 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a280 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
1a290 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
1a2a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1a2b0 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
1a2c0 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
1a2d0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
1a2e0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
1a2f0 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
1a300 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
1a310 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1a320 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
1a330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
1a340 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
1a350 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
1a360 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
1a370 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1a380 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
1a390 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
1a3a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a3b0 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
1a3c0 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
1a3d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1a3e0 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
1a3f0 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
1a400 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
1a410 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1a420 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
1a430 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
1a440 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
1a450 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
1a460 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
1a470 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
1a480 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
1a490 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a4a0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  M_BKPT;.  }else{
1a4b0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
1a4c0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
1a4d0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
1a4e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
1a4f0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
1a500 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1a510 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1a520 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
1a530 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1a540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1a550 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a560 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
1a570 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
1a580 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
1a590 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
1a5a0 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
1a5b0 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
1a5c0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
1a5d0 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
1a5e0 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
1a5f0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
1a600 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
1a610 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
1a620 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
1a630 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
1a640 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
1a650 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
1a660 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
1a670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1a680 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
1a690 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
1a6a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1a6b0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
1a6c0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
1a6d0 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
1a6e0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
1a6f0 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
1a700 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1a710 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  (nMasterJournal 
1a720 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31  + nMasterPtr + 1
1a730 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  );.  if( !zMaste
1a740 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
1a750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a760 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  M_BKPT;.    goto
1a770 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a780 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
1a790 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
1a7a0 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
1a7b0 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
1a7c0 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
1a7d0 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
1a7e0 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
1a7f0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
1a800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a810 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
1a820 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
1a830 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
1a840 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
1a850 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
1a860 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
1a870 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
1a880 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
1a890 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
1a8a0 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
1a8b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a8c0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1a8d0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
1a8e0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1a8f0 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
1a900 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a910 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
1a920 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
1a930 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
1a940 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
1a950 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
1a960 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
1a970 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1a980 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
1a990 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
1a9a0 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
1a9b0 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
1a9c0 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
1a9d0 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
1a9e0 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
1a9f0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1aa00 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
1aa10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
1aa20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
1aa30 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
1aa40 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
1aa50 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1aa60 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1aa70 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
1aa80 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
1aa90 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
1aaa0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1aab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aac0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1aad0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
1aae0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
1aaf0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
1ab00 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
1ab10 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
1ab20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
1ab30 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
1ab40 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1ab50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ab60 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1ab70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
1ab80 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
1ab90 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
1aba0 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
1abb0 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
1abc0 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
1abd0 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
1abe0 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
1abf0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1ac00 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
1ac10 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
1ac20 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1ac30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ac40 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
1ac50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1ac60 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
1ac70 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
1ac80 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
1ac90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
1aca0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
1acb0 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
1acc0 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
1acd0 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
1ace0 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
1acf0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
1ad00 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
1ad10 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
1ad20 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
1ad30 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
1ad40 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
1ad50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ad60 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
1ad70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1ad80 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
1ad90 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
1ada0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
1adb0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
1adc0 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
1add0 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
1ade0 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
1adf0 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
1ae00 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1ae10 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
1ae20 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
1ae30 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
1ae40 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
1ae50 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1ae60 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
1ae70 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73   or the pager is
1ae80 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a   not in either.*
1ae90 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20  * DBMOD or OPEN 
1aea0 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
1aeb0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1aec0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
1aed0 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20  size .** of the 
1aee0 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20  file is changed 
1aef0 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
1af00 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
1af10 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a  geSize bytes). .
1af20 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1af30 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
1af40 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
1af50 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
1af60 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
1af70 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
1af80 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
1af90 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
1afa0 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1afb0 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
1afc0 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
1afd0 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
1afe0 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
1aff0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1b000 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
1b010 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
1b020 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
1b030 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
1b040 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
1b050 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
1b060 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
1b070 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
1b080 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
1b090 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
1b0a0 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
1b0b0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b0c0 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
1b0d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1b0e0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
1b0f0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
1b100 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
1b110 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
1b120 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1b130 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
1b140 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
1b150 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
1b160 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
1b170 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
1b180 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
1b190 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1b1a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1b1b0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1b1c0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
1b1d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1b1e0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
1b1f0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20  R_READER );.  . 
1b200 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1b210 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28  er->fd) .   && (
1b220 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1b230 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1b240 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1b250 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1b260 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ) .  ){.    i64 
1b270 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
1b280 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Size;.    int sz
1b290 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
1b2a0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73  ageSize;.    ass
1b2b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1b2c0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
1b2d0 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44  CK );.    /* TOD
1b2e0 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f  O: Is it safe to
1b2f0 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c   use Pager.dbFil
1b300 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20  eSize here? */. 
1b310 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b320 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1b330 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
1b340 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
1b350 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e   = szPage*(i64)n
1b360 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63  Page;.    if( rc
1b370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
1b380 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53  urrentSize!=newS
1b390 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ize ){.      if(
1b3a0 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77   currentSize>new
1b3b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1b3c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
1b3d0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
1b3e0 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
1b3f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75     }else if( (cu
1b400 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65  rrentSize+szPage
1b410 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  )<=newSize ){.  
1b420 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70        char *pTmp
1b430 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1b440 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65  pace;.        me
1b450 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a  mset(pTmp, 0, sz
1b460 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74  Page);.        t
1b470 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a  estcase( (newSiz
1b480 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72  e-szPage) == cur
1b490 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  rentSize );.    
1b4a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
1b4b0 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e  ewSize-szPage) >
1b4c0 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b    currentSize );
1b4d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1b4e0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1b4f0 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73  ger->fd, pTmp, s
1b500 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73  zPage, newSize-s
1b510 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zPage);.      }.
1b520 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b540 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1b550 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1b560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b570 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b580 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1b590 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f  sanitized versio
1b5a0 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d  n of the sector-
1b5b0 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20  size of OS file 
1b5c0 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65  pFile. The.** re
1b5d0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75  turn value is gu
1b5e0 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20  aranteed to lie 
1b5f0 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d  between 32 and M
1b600 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
1b610 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
1b620 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1b630 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
1b640 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69   int iRet = sqli
1b650 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
1b660 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52  pFile);.  if( iR
1b670 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65  et<32 ){.    iRe
1b680 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  t = 512;.  }else
1b690 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45   if( iRet>MAX_SE
1b6a0 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
1b6b0 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
1b6c0 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
1b6d0 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f  .    iRet = MAX_
1b6e0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
1b6f0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a  .  return iRet;.
1b700 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1b710 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
1b720 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1b730 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
1b740 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
1b750 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
1b760 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
1b770 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
1b780 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
1b790 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1b7a0 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
1b7b0 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
1b7c0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
1b7d0 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c   the size and al
1b7e0 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e  ignment of journ
1b7f0 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a  al header and .*
1b800 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1b810 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e   pointers within
1b820 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c   created journal
1b830 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   files..**.** Fo
1b840 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1b850 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
1b860 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
1b870 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e  lways 512 bytes.
1b880 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1b890 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72  , for non-tempor
1b8a0 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65  ary files, the e
1b8b0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1b8c0 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76  size is.** the v
1b8d0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1b8e0 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1b8f0 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65  () method rounde
1b900 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a  d up to 32 if.**
1b910 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1b920 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20   32, or rounded 
1b930 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
1b940 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
1b950 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1b960 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1b970 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
1b980 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49  ile has the SQLI
1b990 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1b9a0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f  FE_OVERWRITE pro
1b9b0 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a  perty, then set.
1b9c0 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ** the effective
1b9d0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20   sector size to 
1b9e0 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  its minimum valu
1b9f0 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75  e (512).  The pu
1ba00 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67  rpose of.** pPag
1ba10 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69  er->sectorSize i
1ba20 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20  s to define the 
1ba30 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f  "blast radius" o
1ba40 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20  f bytes that.** 
1ba50 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20  might change if 
1ba60 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77  a crash occurs w
1ba70 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
1ba80 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1ba90 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20  .** that range. 
1baa0 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53   But with POWERS
1bab0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74  AFE_OVERWRITE, t
1bac0 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20  he blast radius 
1bad0 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74  is zero.** (that
1bae0 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41   is what POWERSA
1baf0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61  FE_OVERWRITE mea
1bb00 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d  ns), so we minim
1bb10 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a  ize the sector.*
1bb20 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63  * size.  For bac
1bb30 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
1bb40 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c  lity of the roll
1bb50 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
1bb60 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20  e format,.** we 
1bb70 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68  cannot reduce th
1bb80 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1bb90 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31  or size below 51
1bba0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
1bbb0 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
1bbc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1bbd0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1bbe0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1bbf0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1bc00 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
1bc10 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c  r->tempFile.   |
1bc20 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
1bc30 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1bc40 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20  s(pPager->fd) & 
1bc50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1bc60 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1bc70 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
1bc80 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1bc90 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73  Sector size does
1bca0 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74  n't matter for t
1bcb0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
1bcc0 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20  Also, the file. 
1bcd0 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61     ** may not ha
1bce0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79  ve been opened y
1bcf0 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  et, in which cas
1bd00 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69  e the OsSectorSi
1bd10 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ze().    ** call
1bd20 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20   will segfault. 
1bd30 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
1bd40 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
1bd50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
1bd60 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1bd70 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72   = sqlite3Sector
1bd80 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
1bd90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
1bda0 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
1bdb0 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
1bdc0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
1bdd0 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
1bde0 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1bdf0 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
1be00 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
1be10 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
1be20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1be30 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
1be40 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
1be50 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
1be60 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
1be70 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
1be80 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1be90 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1bea0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1beb0 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
1bec0 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
1bed0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1bee0 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
1bef0 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1bf00 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
1bf10 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
1bf20 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
1bf30 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1bf40 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
1bf50 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1bf60 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1bf70 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
1bf80 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
1bf90 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
1bfa0 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
1bfb0 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
1bfc0 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1bfd0 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
1bfe0 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
1bff0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
1c000 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
1c010 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
1c020 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1c030 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1c040 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
1c050 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
1c060 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
1c070 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
1c080 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
1c090 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1c0a0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1c0b0 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
1c0c0 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
1c0d0 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
1c0e0 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
1c0f0 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
1c100 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
1c110 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
1c120 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
1c130 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
1c140 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
1c150 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
1c160 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
1c170 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
1c180 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
1c190 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
1c1a0 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
1c1b0 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
1c1c0 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
1c1d0 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
1c1e0 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
1c1f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
1c200 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1c210 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
1c220 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
1c230 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
1c240 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
1c250 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
1c260 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
1c270 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
1c280 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
1c290 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
1c2a0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1c2b0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
1c2c0 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
1c2d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1c2e0 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
1c2f0 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
1c300 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
1c310 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1c320 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
1c330 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
1c340 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
1c350 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1c360 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
1c370 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
1c380 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
1c390 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
1c3a0 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
1c3b0 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
1c3c0 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
1c3d0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1c3e0 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
1c3f0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1c400 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
1c410 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
1c420 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
1c430 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
1c440 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
1c450 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
1c460 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1c470 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
1c480 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
1c490 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1c4a0 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
1c4b0 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
1c4c0 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
1c4d0 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
1c4e0 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
1c4f0 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
1c500 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
1c510 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
1c520 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
1c530 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
1c540 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
1c550 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
1c560 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
1c570 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
1c580 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
1c590 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
1c5a0 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
1c5b0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
1c5c0 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
1c5d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1c5e0 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
1c5f0 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
1c600 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
1c610 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
1c620 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
1c630 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
1c640 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
1c650 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
1c660 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
1c670 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
1c680 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
1c690 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
1c6a0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1c6b0 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
1c6c0 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
1c6d0 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
1c6e0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
1c6f0 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
1c700 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1c710 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
1c720 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
1c730 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
1c740 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1c750 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
1c760 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1c770 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
1c780 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
1c790 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
1c7a0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
1c7b0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
1c7c0 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
1c7d0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1c7e0 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
1c7f0 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
1c800 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
1c810 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
1c820 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
1c830 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
1c840 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
1c850 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
1c860 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
1c870 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
1c880 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
1c890 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
1c8a0 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
1c8b0 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
1c8c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1c8d0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
1c8e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1c8f0 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
1c900 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1c910 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
1c920 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
1c930 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1c940 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1c950 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1c960 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
1c970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c980 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
1c990 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1c9a0 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1c9c0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1c9d0 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
1c9e0 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
1c9f0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1ca00 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
1ca10 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
1ca20 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1ca30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1ca40 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
1ca50 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1ca60 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
1ca70 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
1ca80 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1ca90 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
1caa0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
1cab0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
1cac0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
1cad0 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
1cae0 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
1caf0 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
1cb00 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
1cb10 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
1cb20 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
1cb30 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61  */.  int nPlayba
1cb40 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ck = 0;       /*
1cb50 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1cb60 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20   pages restored 
1cb70 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
1cb80 20 20 75 33 32 20 73 61 76 65 64 50 61 67 65 53    u32 savedPageS
1cb90 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
1cba0 67 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69  geSize;..  /* Fi
1cbb0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1cbc0 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
1cbd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1cbe0 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
1cbf0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
1cc00 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
1cc10 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1cc20 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
1cc30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1cc40 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1cc50 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
1cc60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cc70 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1cc80 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1cc90 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1cca0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1ccb0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1ccc0 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1ccd0 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1cce0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1ccf0 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1cd00 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1cd10 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1cd20 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1cd30 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1cd40 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1cd50 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1cd60 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1cd70 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1cd80 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1cd90 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1cda0 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1cdb0 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1cdc0 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1cdd0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1cde0 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1cdf0 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1ce00 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1ce10 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1ce20 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1ce30 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1ce40 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1ce50 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68  x.c,.  ** mxPath
1ce60 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
1ce70 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
1ce80 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
1ce90 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
1cea0 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
1ceb0 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
1cec0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1ced0 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
1cee0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1cef0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1cf00 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1cf10 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1cf20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cf30 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1cf40 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
1cf50 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1cf60 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
1cf70 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1cf80 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
1cf90 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
1cfa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cfb0 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
1cfc0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1cfd0 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
1cfe0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1cff0 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
1d000 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
1d010 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
1d020 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
1d030 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
1d040 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
1d050 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1d060 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
1d070 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1d080 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
1d090 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
1d0a0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
1d0b0 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ){.    /* Read t
1d0c0 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
1d0d0 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
1d0e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
1d0f0 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
1d100 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
1d110 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
1d120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1d130 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
1d140 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
1d150 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
1d160 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
1d170 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  st have failed w
1d180 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
1d190 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
1d1a0 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
1d1b0 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
1d1c0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
1d1d0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
1d1e0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
1d1f0 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20  er, isHot, szJ, 
1d200 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
1d210 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d220 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
1d230 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1d240 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
1d250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d260 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1d270 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1d280 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1d290 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
1d2a0 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
1d2b0 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
1d2c0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
1d2d0 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
1d2e0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
1d2f0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
1d300 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
1d310 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
1d320 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
1d330 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
1d340 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
1d350 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
1d360 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
1d370 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
1d380 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
1d390 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1d3a0 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
1d3b0 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
1d3c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1d3d0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1d3e0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1d3f0 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
1d400 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
1d410 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1d420 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
1d430 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1d440 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1d450 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
1d460 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
1d470 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
1d480 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
1d490 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
1d4a0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1d4b0 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
1d4c0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
1d4d0 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
1d4e0 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
1d4f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1d500 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
1d510 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
1d520 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
1d530 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
1d540 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
1d550 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
1d560 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
1d570 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
1d580 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1d590 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
1d5a0 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
1d5b0 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
1d5c0 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
1d5d0 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
1d5e0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
1d5f0 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
1d600 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
1d610 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
1d620 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
1d630 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
1d640 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
1d650 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1d660 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
1d670 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
1d680 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
1d690 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
1d6a0 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
1d6b0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
1d6c0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1d6d0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1d6e0 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
1d6f0 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
1d700 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1d710 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
1d720 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1d730 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
1d740 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
1d750 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
1d760 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
1d770 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1d780 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
1d790 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
1d7a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d7b0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
1d7c0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
1d7d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1d7e0 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
1d7f0 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
1d800 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
1d810 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
1d820 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1d830 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1d840 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
1d850 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
1d860 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
1d870 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1d880 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
1d890 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
1d8a0 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
1d8b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1d8c0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1d8d0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1d8e0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1d8f0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1d900 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
1d910 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d930 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1d940 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
1d950 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1d960 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
1d970 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
1d980 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
1d990 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
1d9a0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
1d9b0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1d9c0 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67   file and/or pag
1d9d0 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a  e cache..    */.
1d9e0 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e      for(u=0; u<n
1d9f0 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20  Rec; u++){.     
1da00 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65   if( needPagerRe
1da10 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  set ){.        p
1da20 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1da30 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64  r);.        need
1da40 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a  PagerReset = 0;.
1da50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1da60 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1da70 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1da80 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r,&pPager->journ
1da90 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20  alOff,0,1,0);.  
1daa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1dab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1dac0 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20   nPlayback++;.  
1dad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dae0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1daf0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1db00 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1db10 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
1db20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1db30 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1db40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1db50 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1db60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1db70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
1db80 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
1db90 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
1dba0 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
1dbb0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1dbc0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
1dbd0 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
1dbe0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1dbf0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
1dc00 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
1dc10 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
1dc20 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
1dc30 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
1dc40 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
1dc50 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
1dc60 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
1dc70 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
1dc80 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
1dc90 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
1dca0 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
1dcb0 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
1dcc0 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
1dcd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dce0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1dcf0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1dd00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1dd10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1dd20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1dd30 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
1dd40 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
1dd50 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
1dd60 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
1dd70 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
1dd80 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
1dd90 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
1dda0 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
1ddb0 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
1ddc0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
1ddd0 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
1dde0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1ddf0 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
1de00 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
1de10 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1de20 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
1de30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1de40 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1de50 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
1de60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1de70 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
1de80 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
1de90 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
1dea0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1deb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1dec0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
1ded0 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
1dee0 26 73 61 76 65 64 50 61 67 65 53 69 7a 65 2c 20  &savedPageSize, 
1def0 2d 31 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 6f  -1);.  }.  /* Fo
1df00 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61  llowing a rollba
1df10 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
1df20 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1df30 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67  back in its orig
1df40 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20  inal.  ** state 
1df50 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
1df60 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
1df70 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65  ction, so invoke
1df80 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
1df90 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1dfa0 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GED file-control
1dfb0 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62   method to disab
1dfc0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65  le the.  ** asse
1dfd0 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74  rtion that the t
1dfe0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1dff0 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e  er was modified.
1e000 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1e010 49 54 45 5f 44 45 42 55 47 0a 20 20 73 71 6c 69  ITE_DEBUG.  sqli
1e020 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1e030 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
1e040 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1e050 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 23 65  UNCHANGED,0);.#e
1e060 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1e070 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1e080 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1e090 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1e0a0 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1e0b0 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1e0c0 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1e0d0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1e0e0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1e0f0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1e100 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1e110 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1e120 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1e130 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1e140 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1e150 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1e160 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1e170 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1e180 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1e190 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1e1a0 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1e1b0 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1e1c0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1e1d0 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1e1e0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1e1f0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1e200 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1e210 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1e220 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1e230 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1e240 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1e250 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1e260 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1e270 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1e280 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1e290 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1e2a0 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1e2b0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1e2c0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1e2d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1e2e0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1e2f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1e300 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1e310 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1e320 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1e330 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1e340 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1e350 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1e360 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1e370 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1e380 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1e390 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e3a0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1e3b0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1e3c0 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1e3d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1e3e0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1e3f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e400 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c  agerSync(pPager,
1e410 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
1e420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e430 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1e440 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
1e450 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
1e460 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20  ]!='\0', 0);.   
1e470 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1e480 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1e490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e4a0 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1e4b0 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  ] && res ){.    
1e4c0 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
1e4d0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1e4e0 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
1e4f0 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
1e500 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
1e510 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
1e520 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
1e530 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1e540 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1e550 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
1e560 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
1e570 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
1e580 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e590 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48  );.  }.  if( isH
1e5a0 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20  ot && nPlayback 
1e5b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
1e5c0 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  og(SQLITE_NOTICE
1e5d0 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
1e5e0 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25 64  K, "recovered %d
1e5f0 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c   pages from %s",
1e600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e610 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67   nPlayback, pPag
1e620 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
1e630 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
1e640 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1e650 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
1e660 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
1e670 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
1e680 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
1e690 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1e6a0 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
1e6b0 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
1e6c0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
1e6d0 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
1e6e0 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1e6f0 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
1e700 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
1e710 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1e720 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1e730 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1e740 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
1e750 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
1e760 61 73 65 20 66 69 6c 65 20 28 6f 72 20 6f 75 74  ase file (or out
1e770 20 6f 66 0a 2a 2a 20 74 68 65 20 57 41 4c 20 69   of.** the WAL i
1e780 66 20 74 68 61 74 20 69 73 20 77 68 65 72 65 20  f that is where 
1e790 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
1e7a0 63 6f 70 79 20 69 66 20 66 6f 75 6e 64 29 20 69  copy if found) i
1e7b0 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
1e7c0 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
1e7d0 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
1e7e0 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
1e7f0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1e800 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
1e810 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1e820 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1e830 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
1e840 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
1e850 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
1e860 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
1e870 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
1e880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e890 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
1e8a0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
1e8b0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
1e8c0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
1e8d0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
1e8e0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1e8f0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e900 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1e910 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
1e920 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
1e930 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1e940 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
1e950 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
1e960 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
1e970 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1e980 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1e990 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1e9a0 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  e */..#ifndef SQ
1e9b0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1e9c0 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20  u32 iFrame = 0; 
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e9e0 46 72 61 6d 65 20 6f 66 20 57 41 4c 20 63 6f 6e  Frame of WAL con
1e9f0 74 61 69 6e 69 6e 67 20 70 67 6e 6f 20 2a 2f 0a  taining pgno */.
1ea00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ea10 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1ea20 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44  _READER && !MEMD
1ea30 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
1ea40 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1ea50 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65  ) );..  if( page
1ea60 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1ea70 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ea80 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
1ea90 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
1eaa0 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  g->pgno, &iFrame
1eab0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1eac0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1ead0 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20   if( iFrame ){. 
1eae0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
1eaf0 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61 67  alReadFrame(pPag
1eb00 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65  er->pWal, iFrame
1eb10 2c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  ,pPager->pageSiz
1eb20 65 2c 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  e,pPg->pData);. 
1eb30 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1eb40 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1eb50 74 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  t = (pPg->pgno-1
1eb60 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1eb70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
1eb80 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1eb90 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
1eba0 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  >pData, pPager->
1ebb0 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65  pageSize, iOffse
1ebc0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
1ebd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1ebe0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1ebf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ec00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1ec10 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  ( pPg->pgno==1 )
1ec20 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
1ec30 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1ec40 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
1ec50 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
1ec60 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
1ec70 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
1ec80 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
1ec90 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
1eca0 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
1ecb0 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
1ecc0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
1ecd0 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
1ece0 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
1ecf0 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
1ed00 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
1ed10 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
1ed20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1ed30 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
1ed40 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
1ed50 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
1ed60 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
1ed70 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
1ed80 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
1ed90 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
1eda0 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
1edb0 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
1edc0 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
1edd0 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
1ede0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1edf0 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
1ee00 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
1ee10 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
1ee20 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
1ee30 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
1ee40 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1ee50 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
1ee60 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
1ee70 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
1ee80 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65    ** white noise
1ee90 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74   equaling 16 byt
1eea0 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61  es of 0xff is va
1eeb0 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
1eec0 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73  so.      ** we s
1eed0 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f  hould still be o
1eee0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
1eef0 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
1ef00 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66  >dbFileVers, 0xf
1ef10 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  f, sizeof(pPager
1ef20 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1ef30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ef40 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
1ef50 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
1ef60 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20  ata)[24];.      
1ef70 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1ef80 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1ef90 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
1efa0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1efb0 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s));.    }.  }. 
1efc0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
1efd0 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d  pPg->pData, pPg-
1efe0 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53  >pgno, 3, rc = S
1eff0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1f000 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
1f010 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1f020 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1f030 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1f040 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1f050 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1f060 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1f070 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  g->pgno));.  PAG
1f080 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1f090 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1f0a0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1f0b0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1f0c0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1f0d0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1f0e0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
1f0f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f100 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61  ** Update the va
1f110 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  lue of the chang
1f120 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66  e-counter at off
1f130 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69  sets 24 and 92 i
1f140 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  n.** the header 
1f150 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76  and the sqlite v
1f160 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74  ersion number at
1f170 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a   offset 96..**.*
1f180 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63  * This is an unc
1f190 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74  onditional updat
1f1a0 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65  e.  See also the
1f1b0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1f1c0 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72  gecounter().** r
1f1d0 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c  outine which onl
1f1e0 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1f1f0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20  ange-counter if 
1f200 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63  the update is ac
1f210 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64  tually.** needed
1f220 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20  , as determined 
1f230 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63  by the pPager->c
1f240 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73  hangeCountDone s
1f250 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a  tate variable..*
1f260 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
1f270 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1f280 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70  counter(PgHdr *p
1f290 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67  Pg){.  u32 chang
1f2a0 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a  e_counter;..  /*
1f2b0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1f2c0 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1f2d0 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1f2e0 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1f2f0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1f300 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
1f310 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61  te((u8*)pPg->pPa
1f320 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1f330 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  +1;.  put32bits(
1f340 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1f350 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
1f360 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41  ounter);..  /* A
1f370 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51  lso store the SQ
1f380 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
1f390 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e  ber in bytes 96.
1f3a0 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20  .99 and in.  ** 
1f3b0 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f  bytes 92..95 sto
1f3c0 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  re the change co
1f3d0 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20  unter for which 
1f3e0 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
1f3f0 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64  er.  ** is valid
1f400 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
1f410 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1f420 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
1f430 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33  counter);.  put3
1f440 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1f450 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51  g->pData)+96, SQ
1f460 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
1f470 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  BER);.}..#ifndef
1f480 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1f490 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f4a0 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
1f4b0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
1f4c0 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ge that has alre
1f4d0 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69  ady been .** wri
1f4e0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f  tten into the lo
1f4f0 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41  g file when a WA
1f500 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1f510 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
1f520 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69   Parameter iPg i
1f530 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1f540 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20  r of said page. 
1f550 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e  The pCtx argumen
1f560 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c  t .** is actuall
1f570 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
1f580 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1f590 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  re..**.** If pag
1f5a0 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74  e iPg is present
1f5b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61   in the cache, a
1f5c0 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  nd has no outsta
1f5d0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1f5e0 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61  ,.** it is disca
1f5f0 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rded. Otherwise,
1f600 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
1f610 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61  e or more outsta
1f620 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e  nding.** referen
1f630 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f  ces, the page co
1f640 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65  ntent is reloade
1f650 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1f660 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61  ase. If the.** a
1f670 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64  ttempt to reload
1f680 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1f690 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
1f6a0 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73  quired and fails
1f6b0 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  , .** return an 
1f6c0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1f6d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
1f6e0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
1f6f0 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f  ic int pagerUndo
1f700 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
1f710 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a  Ctx, Pgno iPg){.
1f720 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f730 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1f740 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
1f750 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a  )pCtx;.  PgHdr *
1f760 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
1f770 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1f780 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73  er) );.  pPg = s
1f790 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1f7a0 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a  p(pPager, iPg);.
1f7b0 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
1f7c0 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63   if( sqlite3Pcac
1f7d0 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  hePageRefcount(p
1f7e0 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Pg)==1 ){.      
1f7f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
1f800 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  p(pPg);.    }els
1f810 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  e{.      rc = re
1f820 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
1f830 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f850 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1f860 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1f870 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1f880 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
1f890 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1f8a0 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1f8b0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1f8c0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1f8d0 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1f8e0 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1f8f0 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1f900 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1f910 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1f920 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1f930 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1f940 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1f950 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1f960 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1f970 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1f980 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1f990 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1f9a0 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1f9b0 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1f9c0 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1f9d0 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1f9e0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1f9f0 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1fa00 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1fa10 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1fa20 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1fa30 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1fa40 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1fa50 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1fa60 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1fa70 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1fa80 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1fa90 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1faa0 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1fab0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1fac0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1fad0 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1fae0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1faf0 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1fb00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fb10 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1fb20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1fb30 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1fb60 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1fb70 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1fb80 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1fb90 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1fba0 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1fbb0 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1fbc0 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1fbd0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1fbe0 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1fbf0 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1fc00 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1fc10 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1fc20 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1fc30 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1fc40 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1fc50 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1fc60 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1fc70 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1fc80 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1fc90 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1fca0 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1fcb0 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1fcc0 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1fcd0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1fce0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1fcf0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1fd00 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1fd10 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1fd20 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1fd30 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1fd40 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1fd50 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1fd60 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69  r->pPCache);..#i
1fd70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fd80 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2f  T_CONCURRENT.  /
1fd90 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1fda0 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
1fdb0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 70 61 67  action, then pag
1fdc0 65 20 31 20 6d 75 73 74 20 62 65 20 72 65 72 65  e 1 must be rere
1fdd0 61 64 20 66 72 6f 6d 20 0a 20 20 2a 2a 20 74 68  ad from .  ** th
1fde0 65 20 64 62 20 66 69 6c 65 2c 20 65 76 65 6e 20  e db file, even 
1fdf0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 64 69 72  if it is not dir
1fe00 74 79 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ty. This is beca
1fe10 75 73 65 20 74 68 65 20 62 2d 74 72 65 65 20 6c  use the b-tree l
1fe20 61 79 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 68  ayer .  ** may h
1fe30 61 76 65 20 61 6c 72 65 61 64 79 20 7a 65 72 6f  ave already zero
1fe40 65 64 20 74 68 65 20 6e 46 72 65 65 20 61 6e 64  ed the nFree and
1fe50 20 69 54 72 75 6e 6b 20 68 65 61 64 65 72 20 66   iTrunk header f
1fe60 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28  ields.  */.  if(
1fe70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1fe80 26 20 28 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  & (pList==0 || p
1fe90 4c 69 73 74 2d 3e 70 67 6e 6f 21 3d 31 29 20 26  List->pgno!=1) &
1fea0 26 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65  & pPager->pAllRe
1feb0 61 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ad ){.    rc = p
1fec0 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1fed0 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20  ((void*)pPager, 
1fee0 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  1);.  }.#endif..
1fef0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1ff00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1ff10 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1ff20 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1ff30 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1ff40 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1ff50 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1ff60 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1ff70 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1ff80 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1ff90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1ffa0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1ffb0 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1ffc0 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1ffd0 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1ffe0 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1fff0 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
20000 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
20010 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
20020 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
20030 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
20040 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
20050 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
20060 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
20070 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
20080 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
20090 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
200a0 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
200b0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
200c0 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
200d0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
200e0 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
200f0 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
20100 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
20110 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
20120 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
20130 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
20140 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
20150 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
20160 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
20170 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
20180 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201a0 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
201b0 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
201c0 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
201d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
201e0 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
201f0 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
20200 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20220 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
20230 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
20240 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20260 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
20270 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
20280 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
20290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
202a0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
202b0 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
202c0 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
202d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
202e0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
202f0 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
20300 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
20310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
20320 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
20330 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
20340 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
20350 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
20360 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
20370 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
20380 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
20390 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
203a0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
203b0 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
203c0 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
203d0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
203e0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
203f0 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
20400 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
20410 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
20420 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
20430 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
20440 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
20450 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
20460 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
20470 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
20480 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
20490 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
204a0 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
204b0 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
204c0 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
204d0 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
204e0 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
204f0 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
20500 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
20510 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
20520 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
20530 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
20540 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
20550 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
20560 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
20570 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
20580 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
20590 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
205a0 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
205b0 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  List++;.        
205c0 50 41 47 45 52 54 52 41 43 45 28 28 22 54 4f 2d  PAGERTRACE(("TO-
205d0 57 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 68  WAL %d page %d h
205e0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
20610 72 29 2c 20 70 2d 3e 70 67 6e 6f 2c 20 70 61 67  r), p->pgno, pag
20620 65 72 5f 70 61 67 65 68 61 73 68 28 70 29 29 29  er_pagehash(p)))
20630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20640 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
20650 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
20660 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d    nList = 1;.  }
20670 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74  .  pPager->aStat
20680 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
20690 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20  E] += nList;..  
206a0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
206b0 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
206c0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
206d0 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71  List);.  rc = sq
206e0 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70  lite3WalFrames(p
206f0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
20700 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
20710 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72  Size, pList, nTr
20720 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74  uncate, isCommit
20730 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  , pPager->walSyn
20740 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66  cFlags.  );.  if
20750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20760 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  && pPager->pBack
20770 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d  up ){.    for(p=
20780 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
20790 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71  Dirty){.      sq
207a0 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
207b0 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
207c0 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20  p, p->pgno, (u8 
207d0 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  *)p->pData);.   
207e0 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
207f0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
20800 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  S.  pList = sqli
20810 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
20820 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
20830 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  he);.  for(p=pLi
20840 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
20850 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73  ty){.    pager_s
20860 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a  et_pagehash(p);.
20870 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
20880 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20890 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74  * Begin a read t
208a0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
208b0 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  e WAL..**.** Thi
208c0 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  s routine used t
208d0 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67  o be called "pag
208e0 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29  erOpenSnapshot()
208f0 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73  " because it ess
20900 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  entially.** make
20910 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20  s a snapshot of 
20920 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
20930 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e  the current poin
20940 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72  t in time and pr
20950 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20  eserves.** that 
20960 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65  snapshot for use
20970 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69   by the reader i
20980 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75  n spite of concu
20990 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20  rrently changes 
209a0 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74  by.** other writ
209b0 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e  ers or checkpoin
209c0 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
209d0 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65  int pagerBeginRe
209e0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  adTransaction(Pa
209f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20a00 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
20a30 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20  /.  int changed 
20a40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
20a50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
20a60 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73  ache must be res
20a70 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
20a80 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
20a90 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
20aa0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20ab0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  ==PAGER_OPEN || 
20ac0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
20ad0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
20ae0 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c  .  /* sqlite3Wal
20af0 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
20b00 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  on() was not cal
20b10 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76  led for the prev
20b20 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ious.  ** transa
20b30 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67  ction in locking
20b40 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e  _mode=EXCLUSIVE.
20b50 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77    So call it now
20b60 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72  .  If we.  ** ar
20b70 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e in locking_mod
20b80 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64  e=NORMAL and End
20b90 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69  Read() was previ
20ba0 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20  ously called,.  
20bb0 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  ** the duplicate
20bc0 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73   call is harmles
20bd0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
20be0 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
20bf0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
20c00 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Wal);..  rc = sq
20c10 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61  lite3WalBeginRea
20c20 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
20c30 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e  ger->pWal, &chan
20c40 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ged);.  if( rc!=
20c50 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61  SQLITE_OK || cha
20c60 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65  nged ){.    page
20c70 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
20c80 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
20c90 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
20ca0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
20cb0 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
20cc0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
20cd0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
20ce0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20cf0 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
20d00 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  t of the transit
20d10 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f  ion from PAGER_O
20d20 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f  PEN.** to PAGER_
20d30 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20  READER state to 
20d40 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
20d50 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
20d60 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61  se file.** in pa
20d70 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  ges (assuming th
20d80 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72  e page size curr
20d90 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
20da0 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e  Pager.pageSize).
20db0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
20dc0 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
20dd0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
20de0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
20df0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
20e00 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f   in pages is sto
20e10 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20  red in *pnPage. 
20e20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
20e30 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70  ror code (perhap
20e40 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52  s.** SQLITE_IOER
20e50 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75  R_FSTAT) is retu
20e60 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65  rned and *pnPage
20e70 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
20e80 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
20e90 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  nt pagerPagecoun
20ea0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
20eb0 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a   Pgno *pnPage){.
20ec0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ee0 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
20ef0 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
20f00 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20   */..  /* Query 
20f10 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
20f20 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  em for the datab
20f30 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61  ase size. The Wa
20f40 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66  lDbsize().  ** f
20f50 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
20f60 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20  zero if the WAL 
20f70 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65  is not open (i.e
20f80 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29  . Pager.pWal==0)
20f90 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65  , or.  ** if the
20fa0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
20fb0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
20fc0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
20fd0 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ze is not.  ** a
20fe0 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
20ff0 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
21000 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   if the log file
21010 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a   is empty or.  *
21020 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61  * contains no va
21030 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72  lid committed tr
21040 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f  ansactions..  */
21050 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21060 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
21070 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
21080 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
21090 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
210a0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
210b0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
210c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
210d0 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
210e0 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69  ;.  nPage = sqli
210f0 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61  te3WalDbsize(pPa
21100 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f  ger->pWal);..  /
21110 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
21120 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
21130 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
21140 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
21150 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d  he.  ** WAL sub-
21160 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e  system, determin
21170 65 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  e the page count
21180 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
21190 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64  ze of.  ** the d
211a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
211b0 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
211c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
211d0 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69  is not an.  ** i
211e0 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
211f0 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  of the page-size
21200 2c 20 72 6f 75 6e 64 20 75 70 20 74 68 65 20 72  , round up the r
21210 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
21220 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 41 4c  ( nPage==0 && AL
21230 57 41 59 53 28 69 73 4f 70 65 6e 28 70 50 61 67  WAYS(isOpen(pPag
21240 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
21250 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21270 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65   Size of db file
21280 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
21290 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
212a0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
212b0 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20  er->fd, &n);.   
212c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
212d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
212e0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
212f0 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28   nPage = (Pgno)(
21300 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (n+pPager->pageS
21310 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d  ize-1) / pPager-
21320 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
21330 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
21340 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
21350 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
21360 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
21370 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67   the.  ** config
21380 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
21390 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
213a0 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
213b0 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
213c0 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
213d0 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
213e0 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
213f0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
21400 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
21410 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
21420 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  }..  *pnPage = n
21430 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
21440 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
21450 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21460 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  _WAL./*.** Check
21470 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
21480 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  le that correspo
21490 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nds to the datab
214a0 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50  ase opened by pP
214b0 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69  ager.** exists i
214c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
214d0 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76  s not empy, or v
214e0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a  erify that the *
214f0 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  -wal file does.*
21500 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20  * not exist (by 
21510 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20  deleting it) if 
21520 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21530 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  e is empty..**.*
21540 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
21550 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61  e is not empty a
21560 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  nd the *-wal fil
21570 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74  e exists, open t
21580 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57  he pager.** in W
21590 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65  AL mode.  If the
215a0 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
215b0 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61  ty or if no *-wa
215c0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
215d0 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72  d.** if no error
215e0 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75   occurs, make su
215f0 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  re Pager.journal
21600 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20  Mode is not set 
21610 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  to.** PAGER_JOUR
21620 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a  NALMODE_WAL..**.
21630 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
21640 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  _OK or an error 
21650 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
21660 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64  caller must hold
21670 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
21680 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
21690 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ile to call this
216a0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65  .** function. Be
216b0 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49  cause an EXCLUSI
216c0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
216d0 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  b file is requir
216e0 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a  ed to delete .**
216f0 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65   a WAL on a none
21700 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c  -empty database,
21710 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
21720 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63  ere is no race c
21730 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74  ondition .** bet
21740 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73  ween the xAccess
21750 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20  () below and an 
21760 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20  xDelete() being 
21770 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65  executed by some
21780 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65   .** other conne
21790 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
217a0 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61   int pagerOpenWa
217b0 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72  lIfPresent(Pager
217c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
217d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
217e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
217f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
21800 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
21810 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
21820 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
21830 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
21840 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
21850 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20   int isWal;     
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21870 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69  * True if WAL fi
21880 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
21890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
218a0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 70  ccess(.        p
218b0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
218c0 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54  ger->zWal, SQLIT
218d0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
218e0 20 26 69 73 57 61 6c 0a 20 20 20 20 29 3b 0a 20   &isWal.    );. 
218f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
21910 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20  ( isWal ){.     
21920 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21940 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
21950 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
21960 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ..        rc = p
21970 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
21980 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
21990 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
219a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
219b0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
219c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
219d0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
219e0 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
219f0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
21a00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21a10 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
21a20 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63  ase( sqlite3Pcac
21a30 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
21a40 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
21a50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
21a60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
21a70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
21a80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21a90 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
21aa0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
21ab0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
21ac0 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
21ad0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21ae0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
21af0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
21b00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21b10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21b20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
21b30 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
21b40 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
21b50 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
21b60 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
21b70 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
21b80 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
21b90 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
21ba0 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
21bb0 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
21bc0 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
21bd0 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
21be0 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
21bf0 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
21c00 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
21c10 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
21c20 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
21c30 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
21c40 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
21c50 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
21c60 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
21c70 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
21c80 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
21c90 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
21ca0 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
21cb0 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
21cc0 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
21cd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
21ce0 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
21cf0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
21d00 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
21d10 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
21d20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
21d30 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
21d40 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
21d50 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
21d60 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
21d70 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
21d80 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
21d90 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
21da0 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
21db0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
21dc0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
21dd0 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
21de0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
21df0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
21e00 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
21e10 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
21e20 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
21e30 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
21e40 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
21e50 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
21e60 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
21e70 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
21e80 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
21e90 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
21ea0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
21eb0 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
21ec0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
21ed0 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
21ee0 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
21ef0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
21f00 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
21f10 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
21f20 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
21f30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
21f40 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
21f50 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
21f60 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
21f70 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
21f80 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
21f90 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
21fa0 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
21fb0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
21fc0 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
21fd0 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
21fe0 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
21ff0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
22000 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
22010 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
22020 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
22030 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
22040 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
22050 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
22060 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
22070 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
22080 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
22090 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
220a0 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
220b0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
220c0 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
220d0 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
220e0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
220f0 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
22100 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
22110 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
22120 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
22130 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
22140 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
22150 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
22160 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
22170 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
22180 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
22190 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
221a0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
221b0 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
221c0 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
221d0 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
221e0 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
221f0 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
22200 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
22210 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
22220 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
22230 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
22240 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
22250 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
22260 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
22270 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
22280 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
22290 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
222a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
222b0 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
222c0 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
222d0 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
222e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
222f0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
22300 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
22310 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
22320 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
22330 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
22340 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
22350 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
22360 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
22370 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
22380 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
22390 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
223a0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
223b0 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
223c0 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
223d0 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
223e0 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
223f0 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
22400 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
22410 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
22420 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
22430 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
22440 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
22450 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
22460 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22470 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
22480 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64  ..  /* Set the d
22490 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63  atabase size bac
224a0 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  k to the value i
224b0 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65  t was before the
224c0 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
224d0 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20   being reverted 
224e0 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  was opened..  */
224f0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
22500 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f  e = pSavepoint ?
22510 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72   pSavepoint->nOr
22520 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f  ig : pPager->dbO
22530 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  rigSize;.  pPage
22540 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
22550 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
22560 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70  pFile;..  if( !p
22570 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67  Savepoint && pag
22580 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
22590 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
225a0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
225b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
225c0 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
225d0 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
225e0 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
225f0 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
22600 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
22610 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
22620 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
22630 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
22640 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
22650 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
22660 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
22670 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
22680 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
22690 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
226a0 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
226b0 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
226c0 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
226d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
226e0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
226f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
22700 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20   || szJ==0 );.. 
22710 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
22720 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
22730 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
22740 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
22750 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
22760 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
22770 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
22780 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
22790 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
227a0 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
227b0 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
227c0 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
227d0 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
227e0 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
227f0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
22800 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
22810 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
22820 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
22830 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
22840 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
22850 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
22860 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
22870 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
22880 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
22890 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21   pSavepoint && !
228a0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
228b0 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  er) ){.    iHdrO
228c0 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
228d0 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
228e0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
228f0 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
22900 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22910 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
22920 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
22930 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
22940 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
22950 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
22960 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
22970 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
22980 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
22990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
229a0 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
229b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
229c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
229d0 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ONE );.  }else{.
229e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
229f0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a  nalOff = 0;.  }.
22a00 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72  .  /* Continue r
22a10 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
22a20 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  rds out of the m
22a30 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
22a40 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65  ting at.  ** the
22a50 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
22a60 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63  eader seen and c
22a70 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20  ontinuing until 
22a80 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e  the effective en
22a90 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61  d.  ** of the ma
22aa0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
22ab0 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b    Continue to sk
22ac0 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  ip out-of-range 
22ad0 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63  pages and.  ** c
22ae0 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70  ontinue adding p
22af0 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
22b00 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a   to pDone..  */.
22b10 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
22b20 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
22b30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
22b40 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
22b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
22b60 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
22b70 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b    u32 nJRec = 0;
22b80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22b90 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
22ba0 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
22bb0 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
22bc0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
22bd0 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52  er, 0, szJ, &nJR
22be0 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
22bf0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22c00 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20  ITE_DONE );..   
22c10 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22   /*.    ** The "
22c20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
22c30 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
22c40 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
22c50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20  r->journalOff". 
22c60 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65     ** test is re
22c70 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20  lated to ticket 
22c80 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20  #2565.  See the 
22c90 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68  discussion in th
22ca0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70  e.    ** pager_p
22cb0 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69  layback() functi
22cc0 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
22cd0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
22ce0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a     */.    if( nJ
22cf0 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
22d00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
22d10 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
22d20 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
22d30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
22d40 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
22d50 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
22d60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22d70 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
22d80 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
22d90 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
22da0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22db0 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
22dc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
22dd0 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
22de0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
22df0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
22e00 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
22e10 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
22e20 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
22e30 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
22e40 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
22e50 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
22e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
22e70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22e80 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  >=szJ );..  /* F
22e90 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
22ea0 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
22eb0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
22ec0 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
22ed0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
22ee0 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
22ef0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
22f00 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
22f10 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
22f20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
22f30 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
22f40 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
22f50 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
22f60 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
22f70 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
22f80 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
22f90 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
22fa0 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
22fb0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
22fc0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
22fd0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69  ageSize);..    i
22fe0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
22ff0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
23000 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53  rc = sqlite3WalS
23010 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61  avepointUndo(pPa
23020 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65  ger->pWal, pSave
23030 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29  point->aWalData)
23040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
23050 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
23060 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
23070 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
23080 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
23090 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
230a0 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69  ( offset==(i64)i
230b0 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
230c0 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
230d0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
230e0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
230f0 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
23100 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
23110 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
23120 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
23130 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
23140 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
23150 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
23160 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23170 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
23180 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
23190 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
231a0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
231b0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
231c0 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
231d0 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
231e0 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
231f0 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63  empting to recyc
23200 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75  le clean and unu
23210 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f  sed pages..*/.vo
23220 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
23230 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
23240 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
23250 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
23260 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
23270 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
23280 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
23290 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
232a0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
232b0 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
232c0 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
232d0 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61  owed.** before a
232e0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69  ttempting to spi
232f0 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72  ll pages to jour
23300 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
23310 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
23320 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
23330 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
23340 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
23350 33 50 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73  3PcacheSetSpills
23360 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
23370 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
23380 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51  ./*.** Invoke SQ
23390 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
233a0 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68  SIZE based on th
233b0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
233c0 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74  of szMmap..*/.st
233d0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
233e0 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72  ixMaplimit(Pager
233f0 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53   *pPager){.#if S
23400 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
23410 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f  IZE>0.  sqlite3_
23420 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
23430 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f  r->fd;.  if( isO
23440 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70  pen(fd) && fd->p
23450 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
23460 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69  n>=3 ){.    sqli
23470 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20  te3_int64 sz;.  
23480 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73    sz = pPager->s
23490 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65  zMmap;.    pPage
234a0 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28  r->bUseFetch = (
234b0 73 7a 3e 30 29 3b 0a 20 20 20 20 73 65 74 47 65  sz>0);.    setGe
234c0 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65  tterMethod(pPage
234d0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  r);.    sqlite3O
234e0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
234f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
23500 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
23510 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23  IZE, &sz);.  }.#
23520 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
23530 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
23540 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65  m size of any me
23550 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64  mory mapping mad
23560 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
23570 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
23580 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
23590 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  mapLimit(Pager *
235a0 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f  pPager, sqlite3_
235b0 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
235c0 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20   pPager->szMmap 
235d0 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65  = szMmap;.  page
235e0 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
235f0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ger);.}../*.** F
23600 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
23610 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
23620 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  rom the pager..*
23630 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
23640 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20  gerShrink(Pager 
23650 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
23660 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28  te3PcacheShrink(
23670 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
23680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
23690 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68  t settings of th
236a0 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65  e pager to those
236b0 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
236c0 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65  e pgFlags parame
236d0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ter..**.** The "
236e0 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67  level" in pgFlag
236f0 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
23700 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20  ONOUS_MASK sets 
23710 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a  the robustness.*
23720 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
23730 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
23740 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72  to OS crashes or
23750 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
23760 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  by.** changing t
23770 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
23780 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
23790 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e  ng the journals.
237a0 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66 6f  .** There are fo
237b0 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ur levels:.**.**
237c0 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
237d0 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
237e0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
237f0 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
23800 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
23810 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
23820 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
23830 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
23840 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
23850 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
23860 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
23870 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
23880 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23890 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
238a0 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
238b0 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
238c0 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
238d0 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
238e0 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
238f0 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
23900 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
23910 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
23920 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
23930 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
23940 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
23950 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
23960 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
23970 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
23980 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
23990 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
239a0 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
239b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
239c0 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
239d0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
239e0 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
239f0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
23a00 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
23a10 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
23a20 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
23a30 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
23a40 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
23a50 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
23a60 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
23a70 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
23a80 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
23a90 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
23ab0 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
23ac0 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
23ad0 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
23ae0 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
23af0 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
23b00 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
23b10 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
23b20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
23b30 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
23b40 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
23b50 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
23b60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23b70 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
23b80 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
23b90 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
23ba0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ollback..**.**  
23bb0 20 20 45 58 54 52 41 20 20 20 20 20 54 68 69 73    EXTRA     This
23bc0 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78   is like FULL ex
23bd0 63 65 70 74 20 74 68 61 74 20 69 73 20 61 6c 73  cept that is als
23be0 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69 72 65  o syncs the dire
23bf0 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  ctory.**        
23c00 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61        that conta
23c10 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ins the rollback
23c20 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20 74   journal after t
23c30 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20  he rollback.**  
23c40 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
23c50 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e  nal is unlinked.
23c60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
23c70 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
23c80 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
23c90 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
23ca0 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
23cb0 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
23cc0 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
23cd0 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
23ce0 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
23cf0 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
23d00 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
23d10 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
23d20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
23d30 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
23d40 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
23d50 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
23d60 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
23d70 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
23d80 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
23d90 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
23da0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
23db0 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
23dc0 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
23dd0 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
23de0 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
23df0 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
23e00 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
23e10 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
23e20 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
23e30 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
23e40 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
23e50 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
23e60 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
23e70 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
23e80 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
23e90 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
23ea0 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54   FULL.** and EXT
23eb0 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e  RA for WAL mode.
23ec0 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
23ed0 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
23ee0 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
23ef0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
23f00 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
23f10 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
23f20 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
23f30 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
23f40 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
23f50 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
23f60 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
23f70 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
23f80 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
23f90 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
23fa0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
23fb0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
23fc0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
23fd0 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
23fe0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
23ff0 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
24000 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
24010 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
24020 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
24030 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
24040 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
24050 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
24060 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
24070 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
24080 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
24090 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
240a0 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
240b0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
240c0 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
240d0 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
240e0 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
240f0 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
24100 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
24110 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
24120 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
24130 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  gs(.  Pager *pPa
24140 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
24150 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20  he pager to set 
24160 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72  safety level for
24170 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
24180 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56  gFlags      /* V
24190 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  arious flags */.
241a0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65  ){.  unsigned le
241b0 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20  vel = pgFlags & 
241c0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
241d0 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70 50  S_MASK;.  if( pP
241e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
241f0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
24200 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
24210 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
24220 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
24230 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20  extraSync = 0;. 
24240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
24250 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
24260 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
24270 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b  RONOUS_OFF ?1:0;
24280 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
24290 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50  lSync = level>=P
242a0 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
242b0 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20  _FULL ?1:0;.    
242c0 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
242d0 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52  c = level==PAGER
242e0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54  _SYNCHRONOUS_EXT
242f0 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69  RA ?1:0;.  }.  i
24300 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
24310 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
24320 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
24330 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
24340 61 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c  ags & PAGER_FULL
24350 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61  FSYNC ){.    pPa
24360 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
24370 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
24380 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
24390 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
243a0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
243b0 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50  NORMAL;.  }.  pP
243c0 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
243d0 67 73 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 79  gs = (pPager->sy
243e0 6e 63 46 6c 61 67 73 3c 3c 32 29 3b 0a 20 20 69  ncFlags<<2);.  i
243f0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
24400 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
24410 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
24420 7c 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  |= pPager->syncF
24430 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lags;.  }.  if( 
24440 28 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52  (pgFlags & PAGER
24450 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 29  _CKPT_FULLFSYNC)
24460 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
24470 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
24480 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
24490 7c 3d 20 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f  |= (SQLITE_SYNC_
244a0 46 55 4c 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20  FULL<<2);.  }.  
244b0 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
244c0 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
244d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
244e0 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
244f0 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
24500 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
24510 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
24520 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
24530 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
24540 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24550 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
24560 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
24570 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
24580 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
24590 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
245a0 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
245b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
245c0 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
245d0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
245e0 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
245f0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
24600 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
24610 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
24620 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
24630 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
24640 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
24650 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
24660 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
24670 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
24680 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
24690 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
246a0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
246b0 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
246c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
246d0 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
246e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
246f0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
24700 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
24710 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
24720 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
24730 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
24740 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
24750 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
24760 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
24770 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
24780 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
24790 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
247a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
247b0 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
247c0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
247d0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
247e0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
247f0 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
24800 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
24810 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
24820 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
24830 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
24840 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
24850 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
24860 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
24870 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
24880 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
24890 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
248a0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
248b0 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
248c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
248d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
248e0 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
248f0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
24900 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
24910 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
24920 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
24930 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
24940 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
24950 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
24960 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
24970 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
24980 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
24990 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
249a0 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
249b0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
249c0 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
249d0 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
249e0 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
249f0 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
24a00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
24a10 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
24a20 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
24a30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24a40 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
24a50 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
24a60 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
24a70 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
24a80 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
24a90 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
24aa0 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
24ab0 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
24ac0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
24ad0 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
24ae0 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
24af0 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
24b00 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
24b10 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
24b20 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
24b30 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
24b40 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
24b50 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
24b60 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
24b70 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
24b80 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
24b90 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
24ba0 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
24bb0 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
24bc0 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
24bd0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
24be0 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
24bf0 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
24c20 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
24c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c60 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
24c70 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
24c80 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
24c90 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
24ca0 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
24cb0 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
24cc0 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
24cd0 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
24ce0 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
24cf0 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
24d00 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
24d10 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
24d20 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
24d30 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
24d40 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
24d50 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
24d60 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
24d70 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
24d80 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
24d90 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
24da0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
24db0 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
24dc0 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
24dd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
24de0 61 67 65 72 53 65 74 42 75 73 79 48 61 6e 64 6c  agerSetBusyHandl
24df0 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
24e00 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
24e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
24e20 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
24e30 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
24e40 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
24e50 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24e60 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
24e70 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
24e80 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
24e90 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
24ea0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
24eb0 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
24ec0 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 76  andler */.){.  v
24ed0 6f 69 64 20 2a 2a 61 70 3b 0a 20 20 70 50 61 67  oid **ap;.  pPag
24ee0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
24ef0 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
24f00 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
24f10 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
24f20 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 20 20  syHandlerArg;.  
24f30 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70  ap = (void **)&p
24f40 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
24f50 6c 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ler;.  assert( (
24f60 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29  (int(*)(void *))
24f70 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48  (ap[0]))==xBusyH
24f80 61 6e 64 6c 65 72 20 29 3b 0a 20 20 61 73 73 65  andler );.  asse
24f90 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79  rt( ap[1]==pBusy
24fa0 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20  HandlerArg );.  
24fb0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
24fc0 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
24fd0 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
24fe0 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28  L_BUSYHANDLER, (
24ff0 76 6f 69 64 20 2a 29 61 70 29 3b 0a 7d 0a 0a 2f  void *)ap);.}../
25000 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
25010 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
25020 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
25030 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
25040 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
25050 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
25060 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
25070 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
25080 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
25090 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
250a0 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
250b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
250c0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
250d0 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
250e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
250f0 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
25100 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53  LITE_IOERR, an S
25110 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20  QLITE_IOERR_xxx 
25120 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49  sub-code or SQLI
25130 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  TE_FULL)..**.** 
25140 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
25150 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
25160 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
25170 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70  **   * the new p
25180 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20  age size (value 
25190 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69  of *pPageSize) i
251a0 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72  s valid (a power
251b0 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20   .**     of two 
251c0 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
251d0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
251e0 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29  SIZE, inclusive)
251f0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
25200 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
25210 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
25220 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a  ferences, and.**
25230 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
25240 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e  base is either n
25250 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ot an in-memory 
25260 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69  database or it i
25270 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d  s.**     an in-m
25280 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
25290 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  hat currently co
252a0 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70  nsists of zero p
252b0 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ages..**.** then
252c0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
252d0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
252e0 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  et to *pPageSize
252f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
25300 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  age size is chan
25310 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ged, then this f
25320 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c  unction uses sql
25330 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28  ite3PagerMalloc(
25340 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  ) .** to obtain 
25350 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70  a new Pager.pTmp
25360 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66  Space buffer. If
25370 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
25380 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69   attempt .** fai
25390 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
253a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
253b0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72   the page size r
253c0 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
253d0 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  . .** In all oth
253e0 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45  er cases, SQLITE
253f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
25400 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
25410 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63  ge size is not c
25420 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62  hanged, either b
25430 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68  ecause one of th
25440 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20  e enumerated.** 
25450 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
25460 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68   is not true, th
25470 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
25480 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
25490 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
254a0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20   was called, or 
254b0 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f  because the memo
254c0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  ry allocation at
254d0 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a  tempt failed, .*
254e0 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a  * then *pPageSiz
254f0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
25500 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61  old, retained pa
25510 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72  ge size before r
25520 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
25530 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
25540 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
25550 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61  pPager, u32 *pPa
25560 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
25570 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
25580 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
25590 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
255a0 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75  sible to do a fu
255b0 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ll assert_pager_
255c0 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73  state() here, as
255d0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
255e0 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
255f0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61  d from within Pa
25600 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72  gerOpen(), befor
25610 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a  e the state.  **
25620 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
25630 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c  ject is internal
25640 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20  ly consistent.. 
25650 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20   **.  ** At one 
25660 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74  point this funct
25670 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20  ion returned an 
25680 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67  error if the pag
25690 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  er was in .  ** 
256a0 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
256b0 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47  e. But since PAG
256c0 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67  ER_ERROR state g
256d0 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20  uarantees that. 
256e0 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20   ** there is at 
256f0 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
25700 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
25710 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74  ence, this funct
25720 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f  ion.  ** is a no
25730 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73  -op for that cas
25740 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a  e anyhow..  */..
25750 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d    u32 pageSize =
25760 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61   *pPageSize;.  a
25770 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
25780 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
25790 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
257a0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
257b0 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28  E_SIZE) );.  if(
257c0 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
257d0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
257e0 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73  Size==0).   && s
257f0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
25800 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
25810 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20  ache)==0 .   && 
25820 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
25830 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65  Size!=(u32)pPage
25840 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29  r->pageSize .  )
25850 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
25860 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
25870 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70       /* New temp
25880 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36   space */.    i6
25890 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20  4 nByte = 0;..  
258a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
258b0 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20  tate>PAGER_OPEN 
258c0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
258d0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72  ->fd) ){.      r
258e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
258f0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
25900 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  , &nByte);.    }
25910 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25930 2f 2a 20 38 20 62 79 74 65 73 20 6f 66 20 7a 65  /* 8 bytes of ze
25940 72 6f 65 64 20 6f 76 65 72 72 75 6e 20 73 70 61  roed overrun spa
25950 63 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  ce is sufficient
25960 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 2d 74   so that the b-t
25970 72 65 65 0a 20 20 20 20 20 20 2a 20 63 65 6c 6c  ree.      * cell
25980 20 68 65 61 64 65 72 20 70 61 72 73 65 72 20 77   header parser w
25990 69 6c 6c 20 6e 65 76 65 72 20 72 75 6e 20 6f 66  ill never run of
259a0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
259b0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
259c0 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61       pNew = (cha
259d0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d  r *)sqlite3PageM
259e0 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 2b 38  alloc(pageSize+8
259f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
25a00 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ew ){.        rc
25a10 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
25a20 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BKPT;.      }els
25a30 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
25a40 74 28 70 4e 65 77 2b 70 61 67 65 53 69 7a 65 2c  t(pNew+pageSize,
25a50 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 8);.      }.
25a60 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
25a70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25a80 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
25a90 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
25aa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
25ab0 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
25ac0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
25ad0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
25ae0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25af0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25b00 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
25b10 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
25b20 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
25b30 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
25b40 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ew;.      pPager
25b50 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
25b60 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
25b70 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
25b80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
25b90 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
25ba0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
25bb0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
25bc0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
25bd0 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
25be0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
25bf0 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
25c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25c10 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
25c20 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
25c30 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
25c40 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
25c50 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
25c60 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
25c70 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
25c80 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
25c90 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
25ca0 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
25cb0 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69     pagerFixMapli
25cc0 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
25cd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25ce0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25cf0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
25d00 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
25d10 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
25d20 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
25d30 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
25d40 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
25d50 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
25d60 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
25d70 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
25d80 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
25d90 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
25da0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
25db0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
25dc0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
25dd0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
25de0 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
25df0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
25e00 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
25e10 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
25e20 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
25e30 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
25e40 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
25e50 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
25e60 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
25e70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
25e80 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
25e90 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
25ea0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
25eb0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
25ec0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
25ed0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
25ee0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
25ef0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
25f00 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
25f10 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
25f20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
25f30 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
25f40 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
25f50 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
25f60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
25f70 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
25f80 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
25f90 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
25fa0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
25fb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25fc0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
25fd0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
25fe0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
25ff0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
26000 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
26010 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
26020 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26030 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
26040 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
26050 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
26060 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
26070 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61 67   /* assert( pPag
26080 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
26090 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 2a 2f  er->dbSize ); */
260a0 0a 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e  .  /* OP_MaxPgcn
260b0 74 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  t ensures that t
260c0 68 65 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  he parameter pas
260d0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
260e0 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  tion is not.  **
260f0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 74   less than the t
26100 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 76  otal number of v
26110 61 6c 69 64 20 70 61 67 65 73 20 69 6e 20 74 68  alid pages in th
26120 65 20 64 61 74 61 62 61 73 65 2e 20 42 75 74 20  e database. But 
26130 74 68 69 73 0a 20 20 2a 2a 20 6d 61 79 20 62 65  this.  ** may be
26140 20 6c 65 73 73 20 74 68 61 6e 20 50 61 67 65 72   less than Pager
26150 2e 64 62 53 69 7a 65 2c 20 61 6e 64 20 73 6f 20  .dbSize, and so 
26160 74 68 65 20 61 73 73 65 72 74 28 29 20 61 62 6f  the assert() abo
26170 76 65 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 20  ve is not valid 
26180 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  */.  return pPag
26190 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
261a0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
261b0 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
261c0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
261d0 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
261e0 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
261f0 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
26200 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
26210 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
26220 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
26230 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
26240 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
26250 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
26260 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
26270 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
26280 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
26290 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
262a0 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
262b0 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
262c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
262d0 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
262e0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
262f0 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
26300 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
26310 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
26320 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
26330 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
26340 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
26350 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
26360 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
26370 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
26380 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
26390 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
263a0 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
263b0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
263c0 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
263d0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
263e0 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
263f0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
26400 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
26410 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
26420 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
26430 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
26440 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
26450 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
26460 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
26470 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
26480 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
26490 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
264a0 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
264b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
264c0 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
264d0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
264e0 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
264f0 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
26500 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
26510 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
26520 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
26530 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
26540 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
26550 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
26560 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
26570 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
26580 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
26590 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
265a0 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
265b0 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
265c0 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
265d0 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
265e0 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
265f0 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
26600 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
26610 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
26620 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
26630 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
26640 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
26650 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
26660 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
26670 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
26680 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
26690 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
266a0 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
266b0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
266c0 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
266d0 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
266e0 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
266f0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
26700 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
26710 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
26720 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
26730 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
26740 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
26750 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
26760 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e );..  /* This 
26770 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
26780 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20  called by btree 
26790 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
267a0 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  r creating.  ** 
267b0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
267c0 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74  .  There has not
267d0 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75   been an opportu
267e0 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69  nity to transiti
267f0 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d  on.  ** to WAL m
26800 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  ode yet..  */.  
26810 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
26820 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
26830 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
26840 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
26850 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
26860 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
26870 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
26880 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
26890 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
268a0 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
268b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
268c0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
268d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
268e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
268f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26900 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
26910 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tion may only be
26920 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
26930 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
26940 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  is open on.** th
26950 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75  e pager. It retu
26960 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
26970 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
26980 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
26990 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  *.** However, if
269a0 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
269b0 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
269c0 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
269d0 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
269e0 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
269f0 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
26a00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26a10 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
26a20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
26a30 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73  t *pnPage){.  as
26a40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
26a50 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
26a60 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
26a70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
26a80 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
26a90 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61  ISHED );.  *pnPa
26aa0 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72  ge = (int)pPager
26ab0 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a  ->dbSize;.}.../*
26ac0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
26ad0 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
26ae0 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65   locktype on the
26af0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
26b00 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20  If.** a similar 
26b10 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
26b20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
26b30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26b40 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65  s a no-op.** (re
26b50 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
26b60 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a  K immediately)..
26b70 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
26b80 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
26b90 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  in the lock usin
26ba0 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  g sqlite3OsLock(
26bb0 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68  ). Invoke .** th
26bc0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
26bd0 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63  if the lock is c
26be0 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
26bf0 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a  ilable. Repeat .
26c00 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  ** until the bus
26c10 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
26c20 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ns false or unti
26c30 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  l the attempt to
26c40 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20   .** obtain the 
26c50 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
26c60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
26c70 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
26c80 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
26c90 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
26ca0 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
26cb0 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
26cc0 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63  is obtained succ
26cd0 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68  essfully, set th
26ce0 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a  e Pager.state .*
26cf0 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f  * variable to lo
26d00 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65  cktype before re
26d10 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
26d20 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
26d30 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
26d40 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
26d50 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
26d60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26d80 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
26d90 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
26da0 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  t this is either
26db0 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73   a no-op (becaus
26dc0 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
26dd0 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c  lock is .  ** al
26de0 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20  ready held), or 
26df0 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73  one of the trans
26e00 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20  itions that the 
26e10 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a  busy-handler.  *
26e20 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64  * may be invoked
26e30 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69   during, accordi
26e40 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e  ng to the commen
26e50 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c  t above.  ** sql
26e60 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
26e70 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a  handler()..  */.
26e80 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
26e90 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79  r->eLock>=lockty
26ea0 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  pe).       || (p
26eb0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
26ec0 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
26ed0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  e==SHARED_LOCK).
26ee0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
26ef0 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  r->eLock==RESERV
26f00 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  ED_LOCK && lockt
26f10 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
26f20 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20  OCK).  );..  do 
26f30 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
26f40 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c  LockDb(pPager, l
26f50 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  ocktype);.  }whi
26f60 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
26f70 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
26f80 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
26f90 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
26fa0 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  Arg) );.  return
26fb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75   rc;.}../*.** Fu
26fc0 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75  nction assertTru
26fd0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
26fe0 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74  pPager) checks t
26ff0 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a  hat one of the .
27000 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
27010 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72  true for all dir
27020 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ty pages current
27030 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ly in the page-c
27040 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  ache:.**.**   a)
27050 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
27060 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
27070 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69   equal to the si
27080 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20  ze of the .**   
27090 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62     current datab
270a0 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61  ase image, in pa
270b0 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20  ges, OR.**.**   
270c0 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63  b) if the page c
270d0 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74  ontent were writ
270e0 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  ten at this time
270f0 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a  , it would not.*
27100 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73  *      be necess
27110 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
27120 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
27130 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d   out to the sub-
27140 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
27150 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62  (as determined b
27160 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52  y function subjR
27170 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a  equiresPage())..
27180 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  **.** If the con
27190 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20  dition asserted 
271a0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
271b0 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20   were not true, 
271c0 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  and the.** dirty
271d0 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65   page were to be
271e0 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20   discarded from 
271f0 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68  the cache via th
27200 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a  e pagerStress().
27210 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65  ** routine, page
27220 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20  rStress() would 
27230 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75  not write the cu
27240 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
27250 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74  nt to.** the dat
27260 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61  abase file. If a
27270 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
27280 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c  action were roll
27290 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a  ed back after.**
272a0 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20   this happened, 
272b0 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
272c0 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f  vior would be to
272d0 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
272e0 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rent.** content 
272f0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77  of the page. How
27300 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73  ever, since this
27310 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
27320 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65  present in eithe
27330 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  r.** the databas
27340 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f  e file or the po
27350 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c  rtion of the rol
27360 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
27370 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  d .** sub-journa
27380 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  l rolled back th
27390 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20  e content could 
273a0 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20  not be restored 
273b0 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  and the.** datab
273c0 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20  ase image would 
273d0 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20  become corrupt. 
273e0 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  It is therefore 
273f0 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a  fortunate that .
27400 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74  ** this circumst
27410 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73  ance cannot aris
27420 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
27430 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
27440 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
27450 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
27460 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50  aintCb(PgHdr *pP
27470 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
27480 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
27490 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74  IRTY );.  assert
274a0 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  ( !subjRequiresP
274b0 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  age(pPg) || pPg-
274c0 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67  >pgno<=pPg->pPag
274d0 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a  er->dbSize );.}.
274e0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
274f0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
27500 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  aint(Pager *pPag
27510 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
27520 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
27530 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
27540 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  , assertTruncate
27550 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d  ConstraintCb);.}
27560 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
27570 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
27580 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
27590 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
275a0 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
275b0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
275c0 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
275d0 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a  ge pages. This .
275e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
275f0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
27600 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
27610 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
27620 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73  It .** just sets
27630 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
27640 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
27650 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
27660 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  the .** truncati
27670 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20  on will be done 
27680 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
27690 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
276a0 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
276b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
276c0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69  s only called ri
276d0 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
276e0 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
276f0 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ion..** Once thi
27700 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  s function has b
27710 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20  een called, the 
27720 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
27730 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f   either be.** ro
27740 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d  lled back or com
27750 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f  mitted. It is no
27760 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74  t safe to call t
27770 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
27780 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75  .** then continu
27790 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
277a0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
277b0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
277c0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
277d0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
277e0 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
277f0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
27800 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
27810 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
27820 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
27830 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
27840 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
27850 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41  = nPage;..  /* A
27860 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20  t one point the 
27870 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64  code here called
27880 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
27890 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20  onstraint() to. 
278a0 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
278b0 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20  all pages being 
278c0 74 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62  truncated away b
278d0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
278e0 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e   are,.  ** if on
278f0 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
27900 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70  ints are open, p
27910 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61  resent in the sa
27920 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f  vepoint .  ** jo
27930 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68  urnal so that th
27940 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
27950 65 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f  ed if the savepo
27960 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20  int is rolled.  
27970 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ** back. This is
27980 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73   no longer neces
27990 73 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e  sary as this fun
279a0 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c  ction is now onl
279b0 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69  y.  ** called ri
279c0 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
279d0 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
279e0 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68  ion. So although
279f0 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
27a00 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c   object may stil
27a10 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65  l have open save
27a20 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53  points (Pager.nS
27a30 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20  avepoint!=0), . 
27a40 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   ** they cannot 
27a50 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
27a60 53 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75  So the assertTru
27a70 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
27a80 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e  ) call.  ** is n
27a90 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74  o longer correct
27aa0 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  . */.}.../*.** T
27ab0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27ac0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74  called before at
27ad0 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a  tempting a hot-j
27ae0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
27af0 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65   It.** syncs the
27b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
27b10 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73   disk, then sets
27b20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27b30 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69  Hdr to the.** si
27b40 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
27b50 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74  l file so that t
27b60 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
27b70 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77  k() routine know
27b80 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e  s.** that the en
27b90 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tire journal fil
27ba0 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
27bb0 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67  d..**.** Syncing
27bc0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74   a hot-journal t
27bd0 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74  o disk before at
27be0 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
27bf0 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73   it back ensures
27c00 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70   .** that if a p
27c10 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63  ower-failure occ
27c20 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
27c30 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f  ollback, the pro
27c40 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74  cess that.** att
27c50 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66  empts rollback f
27c60 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
27c70 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68  recovery sees th
27c80 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a  e same journal.*
27c90 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69  * content as thi
27ca0 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  s process..**.**
27cb0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   If everything g
27cc0 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20  oes as planned, 
27cd0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
27ce0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
27cf0 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
27d00 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
27d10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
27d20 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  yncHotJournal(Pa
27d30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
27d40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27d50 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  OK;.  if( !pPage
27d60 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
27d70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
27d80 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
27d90 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
27da0 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MAL);.  }.  if( 
27db0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27dc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27dd0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
27de0 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
27df0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
27e00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
27e10 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
27e20 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
27e30 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66  .** Obtain a ref
27e40 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f  erence to a memo
27e50 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f  ry mapped page o
27e60 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e  bject for page n
27e70 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20  umber pgno. .** 
27e80 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77  The new object w
27e90 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e  ill use the poin
27ea0 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69  ter pData, obtai
27eb0 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28  ned from xFetch(
27ec0 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  )..** If success
27ed0 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65  ful, set *ppPage
27ee0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
27ef0 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72 65   new page refere
27f00 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  nce.** and retur
27f10 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  n SQLITE_OK. Oth
27f20 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
27f30 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
27f40 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a  ode and set.** *
27f50 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a  ppPage to zero..
27f60 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72  **.** Page refer
27f70 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62  ences obtained b
27f80 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  y calling this f
27f90 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
27fa0 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79  e released.** by
27fb0 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65   calling pagerRe
27fc0 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a  leaseMapPage()..
27fd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
27fe0 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
27ff0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
28000 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
28010 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
28020 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ject */.  Pgno p
28030 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
28040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
28050 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f  e number */.  vo
28060 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  id *pData,      
28070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28080 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74 61   xFetch()'d data
28090 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
280a0 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61  /.  PgHdr **ppPa
280b0 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ge              
280c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75      /* OUT: Acqu
280d0 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74  ired page object
280e0 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a   */.){.  PgHdr *
280f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
28100 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
28110 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 74  ry mapped page t
28120 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20  o return */.  . 
28130 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d   if( pPager->pMm
28140 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20  apFreelist ){.  
28150 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20    *ppPage = p = 
28160 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
28170 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65  elist;.    pPage
28180 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
28190 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
281a0 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
281b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
281c0 67 65 72 2d 3e 6e 45 78 74 72 61 3e 3d 38 20 29  ger->nExtra>=8 )
281d0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  ;.    memset(p->
281e0 70 45 78 74 72 61 2c 20 30 2c 20 38 29 3b 0a 20  pExtra, 0, 8);. 
281f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
28200 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72  age = p = (PgHdr
28210 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
28220 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64  Zero(sizeof(PgHd
28230 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  r) + pPager->nEx
28240 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  tra);.    if( p=
28250 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
28260 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
28270 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
28280 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d  gno-1) * pPager-
28290 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61  >pageSize, pData
282a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
282b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
282c0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  T;.    }.    p->
282d0 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a  pExtra = (void *
282e0 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66  )&p[1];.    p->f
282f0 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41  lags = PGHDR_MMA
28300 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  P;.    p->nRef =
28310 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65   1;.    p->pPage
28320 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a  r = pPager;.  }.
28330 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
28340 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70  xtra==(void *)&p
28350 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  [1] );.  assert(
28360 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a   p->pPage==0 );.
28370 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61    assert( p->fla
28380 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29  gs==PGHDR_MMAP )
28390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
283a0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
283b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52  .  assert( p->nR
283c0 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70  ef==1 );..  p->p
283d0 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d  gno = pgno;.  p-
283e0 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a  >pData = pData;.
283f0 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
28400 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ut++;..  return 
28410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
28420 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  dif../*.** Relea
28430 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  se a reference t
28440 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50 67 20  o page pPg. pPg 
28450 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  must have been r
28460 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a  eturned by an .*
28470 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  * earlier call t
28480 6f 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61  o pagerAcquireMa
28490 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  pPage()..*/.stat
284a0 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c  ic void pagerRel
284b0 65 61 73 65 4d 61 70 50 61 67 65 28 50 67 48 64  easeMapPage(PgHd
284c0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
284d0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
284e0 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72  pPager;.  pPager
284f0 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20  ->nMmapOut--;.  
28500 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  pPg->pDirty = pP
28510 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
28520 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ist;.  pPager->p
28530 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70  MmapFreelist = p
28540 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
28550 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
28560 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33  ods->iVersion>=3
28570 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55   );.  sqlite3OsU
28580 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
28590 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e 70 67  d, (i64)(pPg->pg
285a0 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61  no-1)*pPager->pa
285b0 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61  geSize, pPg->pDa
285c0 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ta);.}../*.** Fr
285d0 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a  ee all PgHdr obj
285e0 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ects stored in t
285f0 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70 46 72  he Pager.pMmapFr
28600 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a  eelist list..*/.
28610 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
28620 72 46 72 65 65 4d 61 70 48 64 72 73 28 50 61 67  rFreeMapHdrs(Pag
28630 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
28640 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72  gHdr *p;.  PgHdr
28650 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
28660 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72  =pPager->pMmapFr
28670 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65  eelist; p; p=pNe
28680 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
28690 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
286a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
286b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 56 65 72 69 66  .  }.}../* Verif
286c0 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  y that the datab
286d0 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  ase file has not
286e0 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20 72   be deleted or r
286f0 65 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a  enamed out from.
28700 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61 67  ** under the pag
28710 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
28720 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61 74  TE_OK if the dat
28730 61 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  abase is still w
28740 68 65 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a  here it ought.**
28750 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20   to be on disk. 
28760 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
28770 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   (SQLITE_READONL
28780 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d  Y_DBMOVED or som
28790 65 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  e other error.**
287a0 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74   code from sqlit
287b0 65 33 4f 73 41 63 63 65 73 73 28 29 29 20 69 66  e3OsAccess()) if
287c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
287d0 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a  s gone missing..
287e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61  */.static int da
287f0 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28  tabaseIsUnmoved(
28800 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28810 20 20 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20    int bHasMoved 
28820 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  = 0;.  int rc;..
28830 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
28840 6d 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  mpFile ) return 
28850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
28860 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
28870 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
28880 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
28890 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
288a0 6d 65 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46  me && pPager->zF
288b0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20  ilename[0] );.  
288c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
288d0 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
288e0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
288f0 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62  TL_HAS_MOVED, &b
28900 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28  HasMoved);.  if(
28910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
28920 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OUND ){.    /* I
28930 66 20 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20  f the HAS_MOVED 
28940 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20  file-control is 
28950 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61  unimplemented, a
28960 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66  ssume that the f
28970 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ile.    ** has n
28980 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20  ot been moved.  
28990 54 68 61 74 20 69 73 20 74 68 65 20 68 69 73 74  That is the hist
289a0 6f 72 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20  orical behavior 
289b0 6f 66 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72  of SQLite: prior
289c0 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   to.    ** versi
289d0 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76  on 3.8.3, it nev
289e0 65 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  er checked */.  
289f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
28a00 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
28a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
28a20 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20  HasMoved ){.    
28a30 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
28a40 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20  ONLY_DBMOVED;.  
28a50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
28a60 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  .../*.** Shutdow
28a70 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
28a80 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
28a90 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
28aa0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
28ab0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
28ac0 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
28ad0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
28ae0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
28af0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
28b00 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
28b10 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
28b20 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
28b30 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
28b40 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
28b50 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
28b60 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
28b70 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
28b80 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
28b90 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
28ba0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
28bb0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
28bc0 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
28bd0 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
28be0 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
28bf0 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
28c00 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
28c10 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
28c20 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
28c30 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
28c40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
28c50 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
28c60 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
28c70 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
28c80 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
28c90 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
28ca0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
28cb0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
28cc0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
28cd0 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
28ce0 67 65 72 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  ger, sqlite3 *db
28cf0 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
28d00 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  (u8*)pPager->pTm
28d10 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
28d20 28 20 64 62 20 7c 7c 20 70 61 67 65 72 55 73 65  ( db || pagerUse
28d30 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
28d40 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
28d50 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
28d60 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61  Pager) );.  disa
28d70 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
28d80 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
28d90 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
28da0 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72  alloc();.  pager
28db0 46 72 65 65 4d 61 70 48 64 72 73 28 70 50 61 67  FreeMapHdrs(pPag
28dc0 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  er);.  /* pPager
28dd0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a  ->errCode = 0; *
28de0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  /.  pPager->excl
28df0 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23  usiveMode = 0;.#
28e00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28e10 49 54 5f 57 41 4c 0a 20 20 7b 0a 20 20 20 20 75  IT_WAL.  {.    u
28e20 38 20 2a 61 20 3d 20 30 3b 0a 20 20 20 20 61 73  8 *a = 0;.    as
28e30 73 65 72 74 28 20 64 62 20 7c 7c 20 70 50 61 67  sert( db || pPag
28e40 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a 20  er->pWal==0 );. 
28e50 20 20 20 69 66 28 20 64 62 20 26 26 20 30 3d 3d     if( db && 0==
28e60 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
28e70 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73  ITE_NoCkptOnClos
28e80 65 29 20 0a 20 20 20 20 20 26 26 20 53 51 4c 49  e) .     && SQLI
28e90 54 45 5f 4f 4b 3d 3d 64 61 74 61 62 61 73 65 49  TE_OK==databaseI
28ea0 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29  sUnmoved(pPager)
28eb0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 20  .    ){.      a 
28ec0 3d 20 70 54 6d 70 3b 0a 20 20 20 20 7d 0a 20 20  = pTmp;.    }.  
28ed0 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73    sqlite3WalClos
28ee0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
28ef0 64 62 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  db, pPager->walS
28f00 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72  yncFlags, pPager
28f10 2d 3e 70 61 67 65 53 69 7a 65 2c 61 29 3b 0a 20  ->pageSize,a);. 
28f20 20 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20     pPager->pWal 
28f30 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
28f40 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
28f50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ager);.  if( MEM
28f60 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  DB ){.    pager_
28f70 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
28f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
28f90 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73  If it is open, s
28fa0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
28fb0 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
28fc0 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ing UnlockAndRol
28fd0 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66  lback..    ** If
28fe0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e   this is not don
28ff0 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e  e, then an unsyn
29000 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
29010 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
29020 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79  .    ** file may
29030 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
29040 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
29050 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
29060 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20  ilure occurs .  
29070 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20    ** while this 
29080 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
29090 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
290a0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
290b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
290c0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
290d0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
290e0 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  o sync the journ
290f0 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61  al, shift the pa
29100 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ger.    ** into 
29110 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
29120 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c   This causes Unl
29130 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74  ockAndRollback t
29140 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20  o unlock the.   
29150 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64   ** database and
29160 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
29170 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  al file without 
29180 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
29190 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63  ll it.    ** bac
291a0 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74  k or finalize it
291b0 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62  . The next datab
291c0 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61  ase user will ha
291d0 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75  ve to do hot-jou
291e0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  rnal.    ** roll
291f0 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65  back before acce
29200 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
29210 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
29220 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
29230 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
29240 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
29250 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79  (pPager, pagerSy
29260 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
29270 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
29280 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
29290 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
292a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
292b0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
292c0 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
292d0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
292e0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
292f0 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
29300 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
29310 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
29320 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
29330 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ).  sqlite3OsClo
29340 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
29350 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
29360 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
29370 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
29380 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65  (pTmp);.  sqlite
29390 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
293a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
293b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
293c0 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
293d0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
293e0 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
293f0 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
29400 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
29410 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
29420 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
29430 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
29440 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
29450 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
29460 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
29470 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
29480 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
29490 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
294a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
294b0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
294c0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
294d0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
294e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
294f0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
29500 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
29510 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
29520 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
29530 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
29540 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
29550 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
29560 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
29570 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
29580 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
29590 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
295a0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
295b0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
295c0 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
295d0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
295e0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
295f0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
29600 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
29610 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
29620 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
29630 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
29640 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
29650 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
29660 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
29670 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
29680 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
29690 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
296a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
296b0 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73  r.noSync flag is
296c0 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
296d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
296e0 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
296f0 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
29700 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
29710 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
29720 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64  de and the .** d
29730 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
29740 73 74 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c  stics of the fil
29750 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c  e-system, as fol
29760 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
29770 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
29780 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ile is an in-mem
29790 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
297a0 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64  , no action need
297b0 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e  .**     be taken
297c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65  ..**.**   * Othe
297d0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65  rwise, if the de
297e0 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
297f0 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41  pport the SAFE_A
29800 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a  PPEND property,.
29810 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20  **     then the 
29820 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68  nRec field of th
29830 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
29840 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20  written journal 
29850 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73  header.**     is
29860 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74   updated to cont
29870 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
29880 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  f journal record
29890 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
298a0 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20     been written 
298b0 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66  following it. If
298c0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70   the pager is op
298d0 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d  erating in full-
298e0 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65  sync.**     mode
298f0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
29900 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
29910 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69  d before this fi
29920 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a  eld is updated..
29930 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
29940 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
29950 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51   support the SEQ
29960 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79  UENTIAL property
29970 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a  , then .**     j
29980 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
29990 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ynced..**.** Or,
299a0 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a   in pseudo-code:
299b0 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54  .**.**   if( NOT
299c0 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72   <in-memory jour
299d0 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69  nal> ){.**     i
299e0 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45  f( NOT SAFE_APPE
299f0 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ND ){.**       i
29a00 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f  f( <full-sync mo
29a10 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  de> ) xSync(<jou
29a20 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
29a30 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52        <update nR
29a40 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20  ec field>.**    
29a50 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   } .**     if( N
29a60 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20  OT SEQUENTIAL ) 
29a70 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
29a80 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  ile>);.**   }.**
29a90 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
29aa0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
29ab0 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52  clears the PGHDR
29ac0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
29ad0 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67  of every .** pag
29ae0 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  e currently held
29af0 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72   in memory befor
29b00 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  e returning SQLI
29b10 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a  TE_OK. If an IO.
29b20 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ** error is enco
29b30 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68  untered, then th
29b40 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
29b50 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
29b60 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
29b70 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
29b80 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
29b90 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b  er, int newHdr){
29ba0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
29bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bc0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
29bd0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
29be0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
29bf0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
29c00 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
29c10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
29c20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
29c30 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
29c40 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
29c50 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
29c60 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
29c70 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
29c80 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
29c90 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
29ca0 6f 63 6b 28 70 50 61 67 65 72 2c 20 30 2c 20 30  ock(pPager, 0, 0
29cb0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
29cc0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
29cd0 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
29ce0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
29cf0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
29d00 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
29d10 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
29d20 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
29d30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
29d40 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
29d50 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
29d60 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
29d70 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
29d80 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
29d90 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
29da0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
29db0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
29dc0 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
29dd0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
29de0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
29df0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
29e00 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
29e10 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
29e20 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
29e30 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
29e40 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
29e50 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
29e60 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
29e70 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
29e80 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
29e90 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
29ea0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
29eb0 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
29ec0 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
29ed0 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
29ee0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
29ef0 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
29f00 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
29f10 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
29f20 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
29f30 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
29f40 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
29f50 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
29f60 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
29f70 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
29f80 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
29f90 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
29fa0 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
29fb0 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
29fc0 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
29fd0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
29fe0 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
29ff0 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
2a000 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
2a010 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
2a020 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
2a030 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
2a040 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
2a050 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
2a060 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
2a070 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
2a080 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
2a090 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
2a0a0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
2a0b0 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
2a0c0 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
2a0d0 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
2a0e0 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
2a0f0 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
2a100 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
2a110 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
2a120 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
2a130 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
2a140 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
2a150 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
2a160 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
2a170 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
2a180 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
2a190 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
2a1a0 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
2a1b0 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
2a1c0 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
2a1d0 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
2a1e0 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
2a1f0 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
2a200 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
2a210 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
2a220 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
2a230 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
2a240 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
2a250 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2a260 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
2a270 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
2a280 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
2a290 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
2a2a0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
2a2b0 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
2a2c0 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
2a2d0 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
2a2e0 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
2a2f0 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
2a300 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
2a310 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
2a320 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
2a330 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2a340 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
2a350 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
2a360 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
2a370 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
2a380 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
2a390 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
2a3a0 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
2a3b0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
2a3c0 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
2a3d0 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
2a3e0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
2a3f0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
2a400 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
2a410 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
2a420 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
2a430 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
2a440 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
2a450 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
2a460 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
2a470 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2a480 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2a490 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
2a4a0 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
2a4b0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
2a4c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a4d0 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
2a4e0 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
2a4f0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
2a500 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
2a510 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
2a520 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
2a530 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a540 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2a550 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
2a560 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
2a570 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
2a580 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a590 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
2a5a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
2a5b0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
2a5c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a5d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2a5e0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
2a5f0 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
2a600 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2a610 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
2a620 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
2a630 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
2a640 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
2a650 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
2a660 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
2a670 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
2a680 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
2a690 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
2a6a0 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
2a6b0 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
2a6c0 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
2a6d0 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
2a6e0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2a6f0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
2a700 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
2a710 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
2a720 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
2a730 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
2a740 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
2a750 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
2a760 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
2a770 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
2a780 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
2a790 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
2a7a0 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
2a7b0 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
2a7c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
2a7d0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
2a7e0 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
2a7f0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
2a800 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
2a810 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
2a820 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
2a830 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
2a840 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2a850 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
2a860 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
2a870 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
2a880 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
2a890 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
2a8a0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
2a8b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2a8c0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
2a8d0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
2a8e0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
2a8f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2a900 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
2a910 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
2a920 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
2a930 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2a940 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
2a950 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2a960 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
2a970 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
2a980 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
2a990 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
2a9a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2a9b0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
2a9c0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
2a9d0 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
2a9e0 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
2a9f0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
2aa00 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
2aa10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2aa20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
2aa30 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2aa40 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
2aa50 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
2aa60 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
2aa70 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2aa80 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
2aa90 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
2aaa0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
2aab0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
2aac0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
2aad0 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
2aae0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
2aaf0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
2ab00 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
2ab10 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
2ab20 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
2ab30 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
2ab40 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
2ab50 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
2ab60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2ab70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
2ab80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2ab90 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
2aba0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
2abb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
2abc0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
2abd0 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
2abe0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
2abf0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
2ac00 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
2ac10 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2ac20 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
2ac30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2ac40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ac50 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
2ac60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2ac70 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
2ac80 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
2ac90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2aca0 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
2acb0 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
2acc0 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
2acd0 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
2ace0 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
2acf0 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
2ad00 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
2ad10 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
2ad20 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
2ad30 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
2ad40 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
2ad50 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
2ad60 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
2ad70 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2ad80 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2ad90 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
2ada0 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
2adb0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2adc0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
2add0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ade0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
2adf0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2ae00 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
2ae10 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
2ae20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
2ae30 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
2ae40 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
2ae50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
2ae60 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
2ae70 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
2ae80 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
2ae90 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
2aea0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
2aeb0 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
2aec0 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
2aed0 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
2aee0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
2aef0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2af00 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
2af10 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
2af20 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
2af30 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2af40 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2af50 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
2af60 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
2af70 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
2af80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
2af90 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
2afa0 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
2afb0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
2afc0 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
2afd0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
2afe0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
2aff0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
2b000 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
2b010 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2b020 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
2b030 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
2b040 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
2b050 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
2b060 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
2b070 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
2b080 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
2b090 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
2b0a0 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
2b0b0 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
2b0c0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
2b0d0 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
2b0e0 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
2b0f0 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
2b100 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
2b110 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
2b120 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
2b130 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
2b140 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
2b150 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
2b160 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
2b170 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
2b180 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
2b190 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
2b1a0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
2b1b0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2b1c0 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
2b1d0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
2b1e0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
2b1f0 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
2b200 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
2b210 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
2b220 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
2b230 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
2b240 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
2b250 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
2b260 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
2b270 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
2b280 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
2b290 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
2b2a0 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
2b2b0 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
2b2c0 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
2b2d0 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
2b2e0 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
2b2f0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2b300 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
2b310 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
2b320 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2b330 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2b340 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
2b350 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2b360 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
2b370 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
2b380 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
2b390 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
2b3a0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
2b3b0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2b3c0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
2b3d0 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72  e_pagelist(Pager
2b3e0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
2b3f0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pList){.  int r
2b400 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b420 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2b430 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
2b440 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
2b450 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63  lled for rollbac
2b460 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54  k pagers in WRIT
2b470 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20  ER_DBMOD state. 
2b480 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
2b490 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2b4a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2b4b0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2b4c0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
2b4d0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
2b4e0 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72  DBMOD );.  asser
2b4f0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
2b500 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
2b510 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2b520 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2b530 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72 74   || pList->pDirt
2b540 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
2b550 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
2b560 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
2b570 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
2b580 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
2b590 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
2b5a0 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
2b5b0 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
2b5c0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
2b5d0 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
2b5e0 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
2b5f0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
2b600 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
2b610 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
2b620 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
2b630 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
2b640 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2b650 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
2b660 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2b670 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
2b680 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
2b690 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
2b6a0 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
2b6b0 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20    /* Before the 
2b6c0 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76  first write, giv
2b6d0 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74  e the VFS a hint
2b6e0 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e   of what the fin
2b6f0 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a  al.  ** file siz
2b700 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a  e will be..  */.
2b710 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2b720 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
2b730 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
2b740 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2b750 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67  E_OK .   && pPag
2b760 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70  er->dbHintSize<p
2b770 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20  Pager->dbSize.  
2b780 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72   && (pList->pDir
2b790 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e  ty || pList->pgn
2b7a0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  o>pPager->dbHint
2b7b0 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73  Size).  ){.    s
2b7c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46  qlite3_int64 szF
2b7d0 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ile = pPager->pa
2b7e0 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
2b7f0 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e  3_int64)pPager->
2b800 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  dbSize;.    sqli
2b810 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
2b820 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
2b830 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
2b840 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65  ZE_HINT, &szFile
2b850 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2b860 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67  bHintSize = pPag
2b870 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a  er->dbSize;.  }.
2b880 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
2b890 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2b8a0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
2b8b0 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b  o = pList->pgno;
2b8c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2b8d0 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
2b8e0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
2b8f0 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
2b900 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
2b910 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
2b920 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
2b930 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
2b940 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77  runcateImage() w
2b950 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
2b960 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
2b970 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
2b980 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
2b990 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
2b9a0 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
2b9b0 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
2b9c0 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
2b9d0 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  **.    ** Also, 
2b9e0 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74  do not write out
2b9f0 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68   any page that h
2ba00 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e  as the PGHDR_DON
2ba10 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20  T_WRITE flag.   
2ba20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20   ** set (set by 
2ba30 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2ba40 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f  Write())..    */
2ba50 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
2ba60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
2ba70 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67   0==(pList->flag
2ba80 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  s&PGHDR_DONT_WRI
2ba90 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  TE) ){.      i64
2baa0 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
2bab0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
2bac0 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f  pageSize;   /* O
2bad0 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a  ffset to write *
2bae0 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  /.      char *pD
2baf0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb10 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74         /* Data t
2bb20 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a  o write */    ..
2bb30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2bb40 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
2bb50 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
2bb60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
2bb70 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
2bb80 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
2bb90 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
2bba0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
2bbb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2bbc0 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
2bbd0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
2bbe0 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
2bbf0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2bc00 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a  _BKPT, pData);..
2bc10 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
2bc20 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
2bc30 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
2bc40 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2bc50 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
2bc60 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2bc70 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
2bc80 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
2bc90 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
2bca0 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
2bcb0 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
2bcc0 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
2bcd0 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
2bce0 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
2bcf0 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
2bd00 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
2bd10 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
2bd20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2bd30 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
2bd40 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
2bd50 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2bd60 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
2bd70 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2bd80 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
2bd90 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
2bda0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
2bdb0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
2bdc0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
2bdd0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2bde0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
2bdf0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
2be00 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
2be10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
2be20 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
2be30 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20  RITE]++;..      
2be40 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61  /* Update any ba
2be50 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70  ckup objects cop
2be60 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
2be70 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e  s of this pager.
2be80 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2be90 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
2bea0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
2beb0 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d  gno, (u8*)pList-
2bec0 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >pData);..      
2bed0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f  PAGERTRACE(("STO
2bee0 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
2bef0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
2bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf10 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2bf20 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
2bf30 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a  ehash(pList)));.
2bf40 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
2bf50 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
2bf60 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
2bf70 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
2bf80 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
2bf90 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
2bfa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bfb0 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
2bfc0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
2bfd0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2bfe0 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
2bff0 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
2c000 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
2c010 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  ;.    pList = pL
2c020 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
2c030 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2c040 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74  ../*.** Ensure t
2c050 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  hat the sub-jour
2c060 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
2c070 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
2c080 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a  dy open, this .*
2c090 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
2c0a0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
2c0b0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2c0c0 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
2c0d0 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
2c0e0 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20  to plan. An .** 
2c0f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
2c100 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2c110 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
2c120 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
2c130 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a  en() .** fails..
2c140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
2c150 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
2c160 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2c170 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c180 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  K;.  if( !isOpen
2c190 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
2c1a0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
2c1b0 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f  flags =  SQLITE_
2c1c0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
2c1d0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
2c1e0 41 44 57 52 49 54 45 20 0a 20 20 20 20 20 20 7c  ADWRITE .      |
2c1f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
2c200 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
2c210 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  N_EXCLUSIVE .   
2c220 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e     | SQLITE_OPEN
2c230 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
2c240 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70 69      int nStmtSpi
2c250 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66  ll = sqlite3Conf
2c260 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20  ig.nStmtSpill;. 
2c270 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
2c280 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2c290 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2c2a0 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
2c2b0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
2c2c0 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c        nStmtSpill
2c2d0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2c2e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
2c2f0 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
2c300 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65 72  >pVfs, 0, pPager
2c310 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e  ->sjfd, flags, n
2c320 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a  StmtSpill);.  }.
2c330 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c340 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
2c350 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
2c360 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
2c370 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
2c380 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a  b-journal. .**.*
2c390 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2c3a0 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
2c3b0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
2c3c0 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
2c3d0 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
2c3e0 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
2c3f0 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
2c400 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
2c410 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2c420 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
2c430 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2c440 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
2c450 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
2c460 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
2c470 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
2c480 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
2c490 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2c4a0 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2c4b0 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
2c4c0 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
2c4d0 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
2c4e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2c4f0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
2c500 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
2c510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c520 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2c530 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2c540 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2c550 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2c560 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2c570 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
2c580 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2c590 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  , if it has not 
2c5a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
2c5b0 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ned */.    asser
2c5c0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2c5d0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
2c5e0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2c5f0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65  er->jfd) || page
2c600 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2c610 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2c620 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2c630 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
2c640 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  SubRec==0 );.   
2c650 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
2c660 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20  eWal(pPager) .  
2c670 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e         || pageIn
2c680 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2c690 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
2c6a0 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
2c6b0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
2c6c0 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2c6d0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2c6e0 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
2c6f0 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
2c700 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
2c710 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
2c720 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
2c730 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
2c740 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
2c750 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
2c760 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2c770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c780 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
2c790 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2c7a0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2c7b0 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
2c7c0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
2c7d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
2c7e0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2c7f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  .#if SQLITE_HAS_
2c800 43 4f 44 45 43 20 20 20 0a 20 20 20 20 20 20 69  CODEC   .      i
2c810 66 28 20 21 70 50 61 67 65 72 2d 3e 73 75 62 6a  f( !pPager->subj
2c820 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
2c830 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2c840 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
2c850 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
2c860 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2c870 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2c880 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
2c890 20 20 20 20 70 44 61 74 61 32 20 3d 20 70 44 61      pData2 = pDa
2c8a0 74 61 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  ta;.      PAGERT
2c8b0 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE(("STMT-JOUR
2c8c0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
2c8d0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2c8e0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
2c8f0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
2c900 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
2c910 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  sjfd, offset, pP
2c920 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
2c930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c940 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2c950 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2c960 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70  (pPager->sjfd, p
2c970 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
2c980 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
2c990 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
2c9a0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
2c9b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c9c0 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
2c9d0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
2c9e0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2c9f0 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  nt>0 );.    rc =
2ca00 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
2ca10 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
2ca20 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
2ca30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
2ca40 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72  atic int subjour
2ca50 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65  nalPageIfRequire
2ca60 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  d(PgHdr *pPg){. 
2ca70 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
2ca80 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
2ca90 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72    return subjour
2caa0 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
2cab0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2cac0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2cad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2cae0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2caf0 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
2cb00 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
2cb10 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
2cb20 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
2cb30 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
2cb40 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
2cb50 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
2cb60 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
2cb70 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
2cb80 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
2cb90 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
2cba0 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
2cbb0 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
2cbc0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2cbd0 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
2cbe0 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
2cbf0 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
2cc00 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
2cc10 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2cc20 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
2cc30 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
2cc40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2cc50 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
2cc60 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
2cc70 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
2cc80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
2cc90 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2cca0 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
2ccb0 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
2ccc0 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
2ccd0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2cce0 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
2ccf0 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
2cd00 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
2cd10 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2cd20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
2cd30 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
2cd40 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2cd50 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
2cd60 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
2cd70 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
2cd80 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2cd90 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2cda0 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
2cdb0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
2cdc0 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
2cdd0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2cde0 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
2cdf0 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
2ce00 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
2ce10 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
2ce20 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
2ce30 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2ce40 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
2ce50 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
2ce60 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
2ce70 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
2ce80 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
2ce90 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
2cea0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
2ceb0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
2cec0 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
2ced0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2cee0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2cef0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
2cf00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
2cf10 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2cf20 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
2cf30 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e  doNotSpill NOSYN
2cf40 43 20 62 69 74 20 69 73 20 73 65 74 20 64 75 72  C bit is set dur
2cf50 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
2cf60 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
2cf70 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
2cf80 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
2cf90 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
2cfa0 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
2cfb0 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
2cfc0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
2cfd0 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
2cfe0 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
2cff0 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
2d000 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
2d010 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
2d020 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
2d030 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52  The doNotSpill R
2d040 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20  OLLBACK and OFF 
2d050 62 69 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c  bits inhibits al
2d060 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67  l cache spilling
2d070 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73  .  ** regardless
2d080 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
2d090 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71  ot a sync is req
2d0a0 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  uired.  This is 
2d0b0 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  set during.  ** 
2d0c0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79  a rollback or by
2d0d0 20 75 73 65 72 20 72 65 71 75 65 73 74 2c 20 72   user request, r
2d0e0 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a  espectively..  *
2d0f0 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20  *.  ** Spilling 
2d100 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74  is also prohibit
2d110 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72  ed when in an er
2d120 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20  ror state since 
2d130 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20  that could.  ** 
2d140 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
2d150 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49   corruption.   I
2d160 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
2d170 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20  plementation it 
2d180 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69  .  ** is impossi
2d190 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50  ble for sqlite3P
2d1a0 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20  cacheFetch() to 
2d1b0 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63  be called with c
2d1c0 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a  reateFlag==3.  *
2d1d0 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65  * while in the e
2d1e0 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63  rror state, henc
2d1f0 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62  e it is impossib
2d200 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
2d210 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63  ine to.  ** be c
2d220 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72  alled in the err
2d230 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72  or state.  Never
2d240 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c  theless, we incl
2d250 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20  ude a NEVER().  
2d260 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20  ** test for the 
2d270 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61  error state as a
2d280 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e   safeguard again
2d290 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65  st future change
2d2a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45  s..  */.  if( NE
2d2b0 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
2d2c0 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51  ode) ) return SQ
2d2d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63  LITE_OK;.  testc
2d2e0 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2d2f0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2d300 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  LAG_ROLLBACK );.
2d310 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2d320 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2d330 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29   SPILLFLAG_OFF )
2d340 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2d350 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2d360 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53   & SPILLFLAG_NOS
2d370 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61  YNC );.  if( pPa
2d380 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a  ger->doNotSpill.
2d390 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e     && ((pPager->
2d3a0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50  doNotSpill & (SP
2d3b0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2d3c0 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29  |SPILLFLAG_OFF))
2d3d0 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  !=0.      || (pP
2d3e0 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
2d3f0 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a  _NEED_SYNC)!=0).
2d400 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2d410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2d420 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
2d430 50 41 47 45 52 5f 53 54 41 54 5f 53 50 49 4c 4c  PAGER_STAT_SPILL
2d440 5d 2b 2b 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72  ]++;.  pPg->pDir
2d450 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61  ty = 0;.  if( pa
2d460 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2d470 29 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ) ){.#ifndef SQL
2d480 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
2d490 45 4e 54 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ENT.    /* If th
2d4a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
2d4b0 20 61 20 22 42 45 47 49 4e 20 43 4f 4e 43 55 52   a "BEGIN CONCUR
2d4c0 52 45 4e 54 22 20 74 72 61 6e 73 61 63 74 69 6f  RENT" transactio
2d4d0 6e 2c 20 74 68 65 20 70 61 67 65 20 0a 20 20 20  n, the page .   
2d4e0 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6c   ** cannot be fl
2d4f0 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 52  ushed to disk. R
2d500 65 74 75 72 6e 20 65 61 72 6c 79 20 69 6e 20 74  eturn early in t
2d510 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  his case. */.   
2d520 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
2d530 6c 52 65 61 64 20 29 20 72 65 74 75 72 6e 20 53  lRead ) return S
2d540 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
2d550 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
2d560 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f   single frame fo
2d570 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74  r this page to t
2d580 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72  he log. */.    r
2d590 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
2d5a0 67 65 49 66 52 65 71 75 69 72 65 64 28 70 50 67  geIfRequired(pPg
2d5b0 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ); .    if( rc==
2d5c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d5d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
2d5e0 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
2d5f0 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Pg, 0, 0);.    }
2d600 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0a 23  .  }else{.    .#
2d610 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2d620 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
2d630 5f 57 52 49 54 45 0a 20 20 20 20 69 66 28 20 70  _WRITE.    if( p
2d640 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
2d650 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2d660 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
2d670 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  reate(pPager->jf
2d680 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
2d690 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
2d6a0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
2d6b0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
2d6c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
2d6d0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
2d6e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
2d6f0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
2d700 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
2d710 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20  HDR_NEED_SYNC . 
2d720 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
2d730 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
2d740 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
2d750 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2d760 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
2d770 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  r, 1);.    }.  .
2d780 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2d790 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d7a0 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65   page out to the
2d7b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d7c0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2d7d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d7e0 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
2d7f0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2d800 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
2d810 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
2d820 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61  ite_pagelist(pPa
2d830 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d  ger, pPg);.    }
2d840 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
2d850 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
2d860 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  n. */.  if( rc==
2d870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d880 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2d890 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
2d8a0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2d8b0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
2d8c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
2d8d0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
2d8e0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2d8f0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2d900 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a  ger, rc); .}../*
2d910 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e  .** Flush all un
2d920 72 65 66 65 72 65 6e 63 65 64 20 64 69 72 74 79  referenced dirty
2d930 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a   pages to disk..
2d940 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2d950 67 65 72 46 6c 75 73 68 28 50 61 67 65 72 20 2a  gerFlush(Pager *
2d960 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2d970 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
2d980 6f 64 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  ode;.  if( !MEMD
2d990 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  B ){.    PgHdr *
2d9a0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
2d9b0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
2d9c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2d9d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
2d9e0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
2d9f0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 77  pPager) );.    w
2da00 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2da10 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
2da20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65        PgHdr *pNe
2da30 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  xt = pList->pDir
2da40 74 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  ty;.      if( pL
2da50 69 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ist->nRef==0 ){.
2da60 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2da70 65 72 53 74 72 65 73 73 28 28 76 6f 69 64 2a 29  erStress((void*)
2da80 70 50 61 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a  pPager, pList);.
2da90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
2daa0 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20  ist = pNext;.   
2dab0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
2dac0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
2dad0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
2dae0 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65  alize a new Page
2daf0 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74  r object and put
2db00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2db10 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  .** in *ppPager.
2db20 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   The pager shoul
2db30 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
2db40 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67  freed by passing
2db50 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65   it.** to sqlite
2db60 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a  3PagerClose()..*
2db70 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
2db80 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
2db90 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
2dba0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2dbb0 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  open..** If zFil
2dbc0 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
2dbd0 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
2dbe0 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
2dbf0 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
2dc00 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
2dc10 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
2dc20 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69  ed. Temporary fi
2dc30 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74  les are be delet
2dc40 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
2dc50 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72  lly when they ar
2dc60 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69  e closed. If zFi
2dc70 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
2dc80 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c  ry:" then .** al
2dc90 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
2dca0 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20   held in cache. 
2dcb0 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
2dcc0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a  ten to disk. .**
2dcd0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2dce0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
2dcf0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2dd00 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
2dd10 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72  nExtra parameter
2dd20 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
2dd30 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2dd40 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
2dd50 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
2dd60 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65  each page refere
2dd70 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20  nce. This space 
2dd80 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
2dd90 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20  the user.** via 
2dda0 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
2ddb0 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 20  GetExtra() API. 
2ddc0 20 57 68 65 6e 20 61 20 6e 65 77 20 70 61 67 65   When a new page
2ddd0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74   is allocated, t
2dde0 68 65 0a 2a 2a 20 66 69 72 73 74 20 38 20 62 79  he.** first 8 by
2ddf0 74 65 73 20 6f 66 20 74 68 69 73 20 73 70 61 63  tes of this spac
2de00 65 20 61 72 65 20 7a 65 72 6f 65 64 20 62 75 74  e are zeroed but
2de10 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69   the remainder i
2de20 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  s uninitialized.
2de30 0a 2a 2a 20 28 54 68 65 20 65 78 74 72 61 20 73  .** (The extra s
2de40 70 61 63 65 20 69 73 20 75 73 65 64 20 62 79 20  pace is used by 
2de50 62 74 72 65 65 20 61 73 20 74 68 65 20 4d 65 6d  btree as the Mem
2de60 50 61 67 65 20 6f 62 6a 65 63 74 2e 29 0a 2a 2a  Page object.).**
2de70 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72  .** The flags ar
2de80 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  gument is used t
2de90 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72  o specify proper
2dea0 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74  ties that affect
2deb0 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f   the.** operatio
2dec0 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20  n of the pager. 
2ded0 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  It should be pas
2dee0 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65  sed some bitwise
2def0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20   combination.** 
2df00 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66  of the PAGER_* f
2df10 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
2df20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
2df30 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
2df40 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
2df50 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
2df60 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
2df70 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
2df80 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
2df90 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
2dfa0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
2dfb0 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
2dfc0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
2dfd0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
2dfe0 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
2dff0 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
2e000 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
2e010 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
2e020 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
2e030 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
2e040 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
2e050 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
2e060 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
2e070 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
2e080 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
2e090 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2e0a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2e0b0 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
2e0c0 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
2e0d0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
2e0e0 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
2e0f0 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
2e100 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
2e110 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
2e120 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
2e130 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2e140 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
2e150 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
2e160 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
2e170 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
2e180 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
2e190 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
2e1a0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
2e1b0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
2e1c0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2e1d0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2e1e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2e1f0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
2e200 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
2e210 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
2e220 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
2e230 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2e240 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
2e250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e260 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
2e270 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
2e280 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
2e290 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2e2a0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
2e2b0 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
2e2c0 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
2e2d0 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
2e2e0 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
2e2f0 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
2e300 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
2e310 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
2e320 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2e330 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
2e340 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
2e350 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
2e360 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2e370 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
2e380 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2e390 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
2e3a0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2e3b0 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
2e3c0 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
2e3d0 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
2e3e0 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
2e3f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e400 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
2e410 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
2e420 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2e430 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45  ABLE_DESERIALIZE
2e440 0a 20 20 69 6e 74 20 6d 65 6d 4a 4d 20 3d 20 30  .  int memJM = 0
2e450 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
2e460 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 6d 6f  emory journal mo
2e470 64 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65  de */.#else.# de
2e480 66 69 6e 65 20 6d 65 6d 4a 4d 20 30 0a 23 65 6e  fine memJM 0.#en
2e490 64 69 66 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e  dif.  int readOn
2e4a0 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2e4b0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2e4c0 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2e4d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2e4e0 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2e4f0 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2e500 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2e510 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2e520 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2e530 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2e540 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2e550 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2e560 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2e570 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e580 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2e590 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2e5a0 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2e5b0 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2e5c0 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2e5d0 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2e5e0 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  nal */.  int pca
2e5f0 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
2e600 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
2e610 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2e620 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
2e630 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ache */.  u32 sz
2e640 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2e650 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2e660 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
2e670 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
2e680 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
2e690 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20   = 0;    /* URI 
2e6a0 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  args to copy */.
2e6b0 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20    int nUri = 0; 
2e6c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2e6d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2e6e0 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55   URI args at *zU
2e6f0 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ri */..  /* Figu
2e700 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
2e710 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65  space is require
2e720 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  d for each journ
2e730 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20  al file-handle. 
2e740 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74   ** (there are t
2e750 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20  wo of them, the 
2e760 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
2e770 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2e780 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c  ).  */.  journal
2e790 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2e7a0 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
2e7b0 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a 20 20  Size(pVfs));..  
2e7c0 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
2e7d0 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
2e7e0 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
2e7f0 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
2e800 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
2e810 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e820 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69  MIT_MEMORYDB.  i
2e830 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52  f( flags & PAGER
2e840 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d  _MEMORY ){.    m
2e850 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66  emDb = 1;.    if
2e860 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2e870 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2e880 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d       zPathname =
2e890 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2e8a0 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  (0, zFilename);.
2e8b0 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e        if( zPathn
2e8c0 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e  ame==0  ) return
2e8d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2e8e0 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e  PT;.      nPathn
2e8f0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2e900 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
2e910 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  ;.      zFilenam
2e920 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
2e930 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
2e940 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20  mpute and store 
2e950 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2e960 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65  e in an allocate
2e970 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  d buffer pointed
2e980 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74  .  ** to by zPat
2e990 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50  hname, length nP
2e9a0 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20  athname. Or, if 
2e9b0 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
2e9c0 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c  ary file,.  ** l
2e9d0 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e  eave both nPathn
2e9e0 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d  ame and zPathnam
2e9f0 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f  e set to 0..  */
2ea00 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
2ea10 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2ea20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2ea30 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68  ar *z;.    nPath
2ea40 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
2ea50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
2ea60 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2ea70 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c  e3DbMallocRaw(0,
2ea80 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20   nPathname*2);. 
2ea90 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2eaa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
2eab0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2eac0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2ead0 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
2eae0 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
2eaf0 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
2eb00 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
2eb10 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
2eb20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
2eb30 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
2eb40 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
2eb50 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
2eb60 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  );.    nPathname
2eb70 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2eb80 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2eb90 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a     z = zUri = &z
2eba0 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33  Filename[sqlite3
2ebb0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
2ebc0 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c  me)+1];.    whil
2ebd0 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a  e( *z ){.      z
2ebe0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2ebf0 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20  n30(z)+1;.      
2ec00 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2ec10 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d  en30(z)+1;.    }
2ec20 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74  .    nUri = (int
2ec30 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b  )(&z[1] - zUri);
2ec40 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72  .    assert( nUr
2ec50 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
2ec60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2ec70 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2ec80 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2ec90 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2eca0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2ecb0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2ecc0 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2ecd0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2ece0 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2ecf0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2ed00 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2ed10 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2ed20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2ed30 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2ed40 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2ed50 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2ed60 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2ed70 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2ed80 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2ed90 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2eda0 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2edb0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2edc0 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2edd0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ede0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2edf0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2ee00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2ee10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ee20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2ee30 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2ee40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ee50 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
2ee60 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
2ee70 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
2ee80 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
2ee90 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
2eea0 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
2eeb0 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
2eec0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
2eed0 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
2eee0 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
2eef0 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
2ef00 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
2ef10 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2ef20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
2ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef40 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
2ef50 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2ef60 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef80 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
2ef90 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
2efa0 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2efb0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2efc0 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
2efd0 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
2efe0 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
2eff0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2f000 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2f010 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2f020 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
2f030 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2f040 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2f050 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2f060 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2f070 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2f080 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2f090 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
2f0a0 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
2f0b0 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2f0c0 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
2f0d0 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
2f0e0 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
2f0f0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2f100 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
2f110 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
2f120 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
2f130 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
2f140 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2f150 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
2f160 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
2f170 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
2f180 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
2f190 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2f1a0 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
2f1b0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
2f1c0 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
2f1d0 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
2f1e0 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
2f1f0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2f200 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  Uri +         /*
2f210 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
2f220 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
2f230 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20  + 2             
2f240 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
2f250 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f260 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50  MIT_WAL.    + nP
2f270 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20  athname + 4 + 2 
2f280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57             /* zW
2f290 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29  al */.#endif.  )
2f2a0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2f2b0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2f2c0 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
2f2d0 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
2f2e0 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
2f2f0 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
2f300 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2f310 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
2f320 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2f330 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  BKPT;.  }.  pPag
2f340 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2f350 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2f360 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2f370 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2f380 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2f390 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2f3a0 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2f3b0 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2f3c0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2f3d0 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2f3e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2f3f0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2f400 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2f410 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2f420 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2f430 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2f440 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2f450 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2f460 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2f470 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2f480 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2f490 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2f4a0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2f4b0 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2f4c0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2f4d0 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2f4e0 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2f4f0 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2f500 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2f510 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2f520 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61  athname ){.    a
2f530 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65  ssert( nPathname
2f540 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >0 );.    pPager
2f550 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
2f560 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
2f570 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2f580 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2f590 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2f5a0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
2f5b0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
2f5c0 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79  f( nUri ) memcpy
2f5d0 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  (&pPager->zFilen
2f5e0 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
2f5f0 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
2f600 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2f610 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2f620 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2f630 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2f640 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2f650 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2f660 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29  urnal\000", 8+2)
2f670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2f680 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2f690 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2f6a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23  er->zJournal);.#
2f6b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f6c0 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2f6d0 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2f6e0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2f6f0 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2f700 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2f710 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2f720 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2f730 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2f740 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2f750 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31   "-wal\000", 4+1
2f760 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2f770 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2f780 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2f790 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64  ger->zWal);.#end
2f7a0 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  if.    sqlite3Db
2f7b0 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2f7c0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2f7d0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2f7e0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2f7f0 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2f800 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2f810 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2f820 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2f830 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2f840 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2f850 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2f860 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2f870 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2f880 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2f890 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2f8a0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2f8b0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2f8c0 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2f8d0 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2f8e0 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 23 69  rt( !memDb );.#i
2f8f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2f900 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20  LE_DESERIALIZE. 
2f910 20 20 20 6d 65 6d 4a 4d 20 3d 20 28 66 6f 75 74     memJM = (fout
2f920 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d  &SQLITE_OPEN_MEM
2f930 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a  ORY)!=0;.#endif.
2f940 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2f950 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2f960 5f 52 45 41 44 4f 4e 4c 59 29 21 3d 30 3b 0a 0a  _READONLY)!=0;..
2f970 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
2f980 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
2f990 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
2f9a0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
2f9b0 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20  ,.    ** choose 
2f9c0 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  a default page s
2f9d0 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68  ize in case we h
2f9e0 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68  ave to create th
2f9f0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2fa00 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61  e file. The defa
2fa10 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ult page size is
2fa20 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a   the maximum of:
2fa30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2fa40 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55    + SQLITE_DEFAU
2fa50 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20  LT_PAGE_SIZE,.  
2fa60 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61    **    + The va
2fa70 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
2fa80 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
2fa90 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20  ize().    **    
2faa0 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61  + The largest pa
2fab0 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e  ge size that can
2fac0 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
2fad0 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  ically..    */. 
2fae0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2faf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
2fb00 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
2fb10 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2fb20 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
2fb30 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  d);.      if( !r
2fb40 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
2fb50 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
2fb60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2fb70 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2fb80 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2fb90 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  E<=SQLITE_MAX_DE
2fba0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
2fbb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
2fbc0 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d  PageDflt<pPager-
2fbd0 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20  >sectorSize ){. 
2fbe0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
2fbf0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
2fc00 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2fc10 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
2fc20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2fc30 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
2fc40 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2fc50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20  _SIZE;.         
2fc60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fc70 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2fc80 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65   (u32)pPager->se
2fc90 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
2fca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2fcb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2fcc0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2fcd0 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  E.        {.    
2fce0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
2fcf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2fd00 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2fd10 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
2fd20 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2fd30 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2fd40 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
2fd50 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
2fd60 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2fd70 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2fd80 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
2fd90 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d           for(ii=
2fda0 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
2fdb0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2fdc0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
2fdd0 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
2fde0 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
2fdf0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2fe00 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20  |(ii>>8)) ){.   
2fe10 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2fe20 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20  eDflt = ii;.    
2fe30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fe40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2fe50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
2fe60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c       pPager->noL
2fe70 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 72  ock = sqlite3_ur
2fe80 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e  i_boolean(zFilen
2fe90 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30  ame, "nolock", 0
2fea0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44  );.      if( (iD
2feb0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
2fec0 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20  _IMMUTABLE)!=0. 
2fed0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2fee0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69  _uri_boolean(zFi
2fef0 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62  lename, "immutab
2ff00 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  le", 0) ){.     
2ff10 20 20 20 20 20 76 66 73 46 6c 61 67 73 20 7c 3d       vfsFlags |=
2ff20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2ff30 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 20  DONLY;.         
2ff40 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74   goto act_like_t
2ff50 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20  emp_file;.      
2ff60 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
2ff70 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
2ff80 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
2ff90 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
2ffa0 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
2ffb0 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
2ffc0 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
2ffd0 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
2ffe0 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
2fff0 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
30000 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
30010 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
30020 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
30030 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
30040 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
30050 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
30060 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
30070 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
30080 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
30090 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
300a0 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
300b0 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
300c0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
300d0 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
300e0 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
300f0 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
30100 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
30110 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 61 6c  * This branch al
30120 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69 6c 65  so runs for file
30130 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d 75  s marked as immu
30140 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61  table..    */ .a
30150 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c  ct_like_temp_fil
30160 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  e:.    tempFile 
30170 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
30180 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
30190 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a 20 50  READER;     /* P
301a0 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65 61 64  retend we alread
301b0 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f  y have a lock */
301c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f  .    pPager->eLo
301d0 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  ck = EXCLUSIVE_L
301e0 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74 65  OCK;    /* Prete
301f0 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45 58 43  nd we are in EXC
30200 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20  LUSIVE mode */. 
30210 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63     pPager->noLoc
30220 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  k = 1;          
30230 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c        /* Do no l
30240 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65  ocking */.    re
30250 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61  adOnly = (vfsFla
30260 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs&SQLITE_OPEN_R
30270 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20  EADONLY);.  }.. 
30280 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
30290 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53  g call to PagerS
302a0 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72  etPagesize() ser
302b0 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76  ves to set the v
302c0 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61  alue of .  ** Pa
302d0 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64  ger.pageSize and
302e0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
302f0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
30300 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20   buffer..  */.  
30310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30320 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
30330 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
30340 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
30350 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
30360 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73  esize(pPager, &s
30370 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a  zPageDflt, -1);.
30380 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
30390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
303a0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
303b0 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f  ize the PCache o
303c0 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20  bject. */.  if( 
303d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
303e0 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f  .    nExtra = RO
303f0 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20  UND8(nExtra);.  
30400 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
30410 3e 3d 38 20 26 26 20 6e 45 78 74 72 61 3c 31 30  >=8 && nExtra<10
30420 30 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  00 );.    rc = s
30430 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
30440 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
30450 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
30460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30470 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
30480 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
30490 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
304a0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a  ->pPCache);.  }.
304b0 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
304c0 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65  r occurred above
304d0 2c 20 66 72 65 65 20 74 68 65 20 20 50 61 67 65  , free the  Page
304e0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
304f0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
30500 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
30510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30520 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
30530 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
30540 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
30550 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
30560 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
30570 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
30580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
30590 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
305a0 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
305b0 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61  FILEHANDLEID(pPa
305c0 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72  ger->fd), pPager
305d0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  ->zFilename));. 
305e0 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
305f0 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
30600 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
30610 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d  ame))..  pPager-
30620 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  >useJournal = (u
30630 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20  8)useJournal;.  
30640 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
30650 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
30660 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
30670 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
30680 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
30690 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
306a0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
306b0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
306c0 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
306d0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
306e0 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
306f0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
30700 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
30710 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67  COUNT;.  /* pPag
30720 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
30730 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f  R_UNLOCK; */.  /
30740 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
30750 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
30760 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
30770 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
30780 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
30790 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
307a0 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
307b0 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
307c0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
307d0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
307e0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
307f0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
30800 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
30810 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
30820 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
30830 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
30840 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
30850 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
30860 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
30870 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
30880 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
30890 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
308a0 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73  ly;.  assert( us
308b0 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67  eJournal || pPag
308c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
308d0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
308e0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
308f0 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
30900 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
30910 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30920 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a  >fullSync==0 );.
30930 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30940 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30  er->extraSync==0
30950 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
30960 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
30970 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  s==0 );.    asse
30980 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  rt( pPager->walS
30990 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
309a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
309b0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31  er->fullSync = 1
309c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  ;.    pPager->ex
309d0 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  traSync = 0;.   
309e0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
309f0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
30a00 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
30a10 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
30a20 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
30a30 4e 4f 52 4d 41 4c 20 7c 20 28 53 51 4c 49 54 45  NORMAL | (SQLITE
30a40 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3c 3c 32 29  _SYNC_NORMAL<<2)
30a50 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
30a60 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
30a70 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
30a80 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
30a90 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
30aa0 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
30ab0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
30ac0 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20  = (u16)nExtra;. 
30ad0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
30ae0 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49  SizeLimit = SQLI
30af0 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e  TE_DEFAULT_JOURN
30b00 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20  AL_SIZE_LIMIT;. 
30b10 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
30b20 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74  pPager->fd) || t
30b30 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74  empFile );.  set
30b40 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
30b50 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f  r);.  if( !useJo
30b60 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61  urnal ){.    pPa
30b70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
30b80 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
30b90 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  MODE_OFF;.  }els
30ba0 65 20 69 66 28 20 6d 65 6d 44 62 20 7c 7c 20 6d  e if( memDb || m
30bb0 65 6d 4a 4d 20 29 7b 0a 20 20 20 20 70 50 61 67  emJM ){.    pPag
30bc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
30bd0 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
30be0 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  ODE_MEMORY;.  }.
30bf0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75    /* pPager->xBu
30c00 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
30c10 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
30c20 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
30c30 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
30c40 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
30c50 69 6e 69 74 3b 0a 20 20 73 65 74 47 65 74 74 65  init;.  setGette
30c60 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b  rMethod(pPager);
30c70 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
30c80 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
30c90 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
30ca0 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70  ash)); */.  /* p
30cb0 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
30cc0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
30cd0 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c  MAP_SIZE // will
30ce0 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65 65   be set by btree
30cf0 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  .c */..  *ppPage
30d00 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
30d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30d20 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }..../*.** This 
30d30 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
30d40 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74  ed after transit
30d50 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45  ioning from PAGE
30d60 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50  R_UNLOCK to.** P
30d70 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
30d80 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74  e. It tests if t
30d90 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
30da0 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e  urnal present in
30db0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
30dc0 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65  tem for the give
30dd0 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a  n pager. A hot j
30de0 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
30df0 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  at .** needs to 
30e00 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  be played back. 
30e10 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  According to thi
30e20 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f  s function, a ho
30e30 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
30e40 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  e exists if the 
30e50 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
30e60 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ia are met:.**.*
30e70 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61  *   * The journa
30e80 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e  l file exists in
30e90 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
30ea0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20  , and.**   * No 
30eb0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
30ec0 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
30ed0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
30ee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
30ef0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  nd.**   * The da
30f00 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
30f10 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68  lf is greater th
30f20 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
30f30 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ze, and.**   * T
30f40 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
30f50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30f60 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  e exists and is 
30f70 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20  not 0x00..**.** 
30f80 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
30f90 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
30fa0 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
30fb0 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
30fc0 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
30fd0 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
30fe0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
30ff0 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
31000 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
31010 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
31020 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
31030 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31040 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65   is.** just dele
31050 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65  ted using OsDele
31060 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  te, *pExists is 
31070 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
31080 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
31090 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
310a0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
310b0 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  ot check if ther
310c0 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  e is a master jo
310d0 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a  urnal filename.*
310e0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
310f0 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
31100 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20  re is, and that 
31110 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
31120 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
31130 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20  exist, then the 
31140 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
31150 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20  not really hot. 
31160 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
31170 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
31180 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65  l return a false
31190 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70  -positive. The p
311a0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a  ager_playback().
311b0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
311c0 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
311d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
311e0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
311f0 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f   and .** will no
31200 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  t roll it back. 
31210 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d  .**.** If a hot-
31220 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
31230 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20  found to exist, 
31240 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
31250 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  to 1 and .** SQL
31260 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
31270 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e   If no hot-journ
31280 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
31290 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a  nt, *pExists is.
312a0 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  ** set to 0 and 
312b0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
312c0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
312d0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
312e0 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74  trying.** to det
312f0 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
31300 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72  r not a hot-jour
31310 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
31320 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a   the IO error.**
31330 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
31340 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
31350 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75  of *pExists is u
31360 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
31370 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
31380 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
31390 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
313a0 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
313b0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
313c0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
313d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
313e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  _OK;           /
313f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
31400 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20  .  int exists = 
31410 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
31420 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f   /* True if a jo
31430 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
31440 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  esent */.  int j
31450 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70  rnlOpen = !!isOp
31460 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
31470 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
31480 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
31490 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
314a0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
314b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
314c0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
314d0 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73  R_OPEN );..  ass
314e0 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30  ert( jrnlOpen==0
314f0 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44   || ( sqlite3OsD
31500 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
31510 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  tics(pPager->jfd
31520 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49  ) &.    SQLITE_I
31530 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
31540 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b  _WHEN_OPEN.  ));
31550 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ..  *pExists = 0
31560 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65  ;.  if( !jrnlOpe
31570 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
31580 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
31590 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
315a0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
315b0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
315c0 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  sts);.  }.  if( 
315d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
315e0 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69   exists ){.    i
315f0 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20  nt locked = 0;  
31600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
31610 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65  ue if some proce
31620 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
31630 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20  VED lock */..   
31640 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69   /* Race conditi
31650 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65  on here:  Anothe
31660 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
31670 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e  have been holdin
31680 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  g the.    ** the
31690 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
316a0 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61  nd have a journa
316b0 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71  l open at the sq
316c0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
316d0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f  .    ** call abo
316e0 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c  ve, but then del
316f0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
31700 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63  and drop the loc
31710 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  k before.    ** 
31720 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f  we get to the fo
31730 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f  llowing sqlite3O
31740 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
31750 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74  ck() call.  If t
31760 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  hat.    ** is th
31770 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75  e case, this rou
31780 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b  tine might think
31790 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
317a0 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20  journal when.   
317b0 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72   ** in fact ther
317c0 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73  e is none.  This
317d0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61   results in a fa
317e0 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69  lse-positive whi
317f0 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ch will.    ** b
31800 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
31810 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75  the playback rou
31820 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33  tine.  Ticket #3
31830 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  883..    */.    
31840 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68  rc = sqlite3OsCh
31850 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
31860 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63  pPager->fd, &loc
31870 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ked);.    if( rc
31880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
31890 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20  locked ){.      
318a0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
318b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
318c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
318d0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
318e0 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
318f0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
31900 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  le==0 );.      r
31910 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
31920 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
31930 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
31940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31950 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
31960 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65 72   database is zer
31970 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c  o pages in size,
31980 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
31990 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65 0a   either (1) the.
319a0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
319b0 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20  al is a remnant 
319c0 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74  from a prior dat
319d0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
319e0 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20  ame name where. 
319f0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61         ** the da
31a00 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74 20  tabase file but 
31a10 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
31a20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20  was deleted, or 
31a30 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  (2) the initial.
31a40 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
31a50 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75  action that popu
31a60 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74 61  lates a new data
31a70 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f  base is being ro
31a80 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20  lled back..     
31a90 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20     ** In either 
31aa0 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  case, the journa
31ab0 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65  l file can be de
31ac0 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c  leted.  However,
31ad0 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20   take care.     
31ae0 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c     ** not to del
31af0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
31b00 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c  file if it is al
31b10 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74  ready open due t
31b20 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  o.        ** jou
31b30 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
31b40 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  T..        */.  
31b50 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
31b60 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20  =0 && !jrnlOpen 
31b70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
31b80 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
31b90 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
31ba0 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b     if( pagerLock
31bb0 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
31bc0 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54  VED_LOCK)==SQLIT
31bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31be0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
31bf0 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
31c00 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
31c10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
31c20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
31c30 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e  veMode ) pagerUn
31c40 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
31c50 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
31c60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31c70 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
31c80 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
31c90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31ca0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
31cb0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
31cc0 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f   and no other co
31cd0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72  nnection has a r
31ce0 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20  eserved.        
31cf0 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20    ** or greater 
31d00 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
31d10 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63  base file. Now c
31d20 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20  heck that there 
31d30 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
31d40 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e  at least one non
31d50 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74  -zero bytes at t
31d60 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
31d70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
31d80 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
31d90 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20  ere is, then we 
31da0 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f  consider this jo
31db0 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e  urnal to be hot.
31dc0 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20   If not, .      
31dd0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
31de0 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20   ignored..      
31df0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
31e00 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
31e10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
31e20 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
31e30 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
31e40 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
31e50 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
31e60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
31e70 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
31e80 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
31e90 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b  er->jfd, f, &f);
31ea0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31eb0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
31ec0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31ed0 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74          u8 first
31ee0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31ef0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31f00 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
31f10 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74  , (void *)&first
31f20 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
31f30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31f40 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
31f50 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
31f60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31f70 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
31f80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
31f90 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
31fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
31fb0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
31fc0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
31fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31fe0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
31ff0 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
32000 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
32010 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
32020 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
32030 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
32040 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
32050 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
32060 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
32070 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
32080 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65    ** it has a ze
32090 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
320a0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
320b0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
320c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
320d0 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
320e0 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
320f0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
32100 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
32110 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
32120 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
32130 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
32140 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
32150 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
32160 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
32170 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
32180 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
32190 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
321a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
321b0 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
321c0 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
321d0 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
321e0 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
321f0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
32200 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
32210 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
32220 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
32230 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
32240 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
32250 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
32260 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
32270 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
32280 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
32290 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
322a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
322b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
322c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
322d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
322e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
322f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
32300 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
32310 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
32320 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
32330 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
32340 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
32350 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61 66  erGet() until af
32360 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
32370 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
32380 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
32390 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
323a0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
323b0 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
323c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
323d0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
323e0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
323f0 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
32400 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
32410 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
32420 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
32430 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
32440 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
32450 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
32460 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
32470 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
32480 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
32490 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
324a0 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
324b0 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
324c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
324d0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
324e0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
324f0 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
32500 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
32510 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
32520 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
32530 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
32540 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
32550 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
32560 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
32570 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
32580 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
32590 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
325a0 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
325b0 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
325c0 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
325d0 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
325e0 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
325f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32600 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
32610 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
32620 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
32630 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
32640 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
32650 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
32660 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
32670 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
32680 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
32690 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
326a0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
326b0 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
326c0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
326d0 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
326e0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
326f0 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
32700 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
32710 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
32720 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
32730 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
32740 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
32750 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
32760 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
32770 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
32780 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
32790 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
327a0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
327b0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
327c0 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
327d0 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
327e0 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
327f0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
32800 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c   file or .** rol
32810 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
32820 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
32830 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
32840 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
32850 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
32860 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
32870 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
32880 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
32890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
328a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
328b0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
328c0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
328d0 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
328e0 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
328f0 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
32900 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54  tanding pages. T
32910 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
32920 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65   the pager state
32930 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20   should either. 
32940 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52   ** be OPEN or R
32950 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73  EADER. READER is
32960 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
32970 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
32980 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65  r was in .  ** e
32990 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
329a0 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  mode.  */.  asse
329b0 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
329c0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
329d0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
329e0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
329f0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
32a00 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
32a10 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
32a20 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
32a30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32a40 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
32a50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
32a60 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
32a70 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
32a80 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
32a90 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
32aa0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
32ab0 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48  EN ){.    int bH
32ac0 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20  otJournal = 1;  
32ad0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
32ae0 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
32af0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69  a hot journal-fi
32b00 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  le */..    asser
32b10 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
32b20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32b30 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
32b40 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
32b50 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
32b60 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
32b70 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
32b80 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
32b90 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
32ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32bb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32bc0 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
32bd0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  K || pPager->eLo
32be0 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
32bf0 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   );.      goto f
32c00 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
32c10 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
32c20 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
32c30 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
32c40 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
32c50 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
32c60 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
32c70 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
32c80 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
32c90 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
32ca0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
32cb0 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  er->eLock<=SHARE
32cc0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
32cd0 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e  rc = hasHotJourn
32ce0 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74  al(pPager, &bHot
32cf0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a  Journal);.    }.
32d00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32d10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
32d20 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
32d30 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f  }.    if( bHotJo
32d40 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
32d50 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
32d60 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nly ){.        r
32d70 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
32d80 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  NLY_ROLLBACK;.  
32d90 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
32da0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
32db0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
32dc0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
32dd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32de0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
32df0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
32e00 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
32e10 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
32e20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
32e30 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
32e40 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
32e50 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
32e60 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
32e70 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
32e80 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
32e90 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
32ea0 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
32eb0 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
32ec0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
32ed0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
32ee0 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
32ef0 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
32f00 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
32f10 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
32f20 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
32f30 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
32f40 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
32f50 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
32f60 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
32f70 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
32f80 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
32f90 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
32fa0 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
32fb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
32fc0 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
32fd0 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
32fe0 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
32ff0 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
33000 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
33010 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
33020 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
33030 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
33040 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74       ** Unless t
33050 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c  he pager is in l
33060 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
33070 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
33080 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a  lock is.      **
33090 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53   downgraded to S
330a0 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72  HARED_LOCK befor
330b0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
330c0 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a  returns..      *
330d0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
330e0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
330f0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
33100 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
33110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33120 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
33130 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
33140 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    /* If it is no
33150 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61  t already open a
33160 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  nd the file exis
33170 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e  ts on disk, open
33180 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a   the .      ** j
33190 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
331a0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72  write access. Wr
331b0 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65  ite access is re
331c0 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a  quired because .
331d0 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c        ** in excl
331e0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
331f0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
33200 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
33210 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a  pt open .      *
33220 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75  * and possibly u
33230 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
33240 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
33250 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65  Also, write-acce
33260 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ss .      ** is 
33270 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64  usually required
33280 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
33290 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72   journal in jour
332a0 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74  nal_mode=persist
332b0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20   .      ** mode 
332c0 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f  (and also for jo
332d0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63  urnal_mode=trunc
332e0 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  ate on some syst
332f0 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ems)..      **. 
33300 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a       ** If the j
33310 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
33320 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c  exist, it usuall
33330 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  y means that som
33340 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  e .      ** othe
33350 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e  r connection man
33360 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61  aged to get in a
33370 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  nd roll it back 
33380 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  before .      **
33390 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
333a0 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78   obtained the ex
333b0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f  clusive lock abo
333c0 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20  ve. Or, it .    
333d0 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68    ** may mean th
333e0 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73  at the pager was
333f0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
33400 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20  ate when this.  
33410 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
33420 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74  was called and t
33430 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
33440 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
33450 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
33460 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
33470 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
33480 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
33490 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
334a0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
334b0 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b      int bExists;
334c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
334d0 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
334e0 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
334f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
33500 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
33510 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
33520 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
33530 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
33540 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73  EXISTS, &bExists
33550 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
33560 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33570 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  bExists ){.     
33580 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
33590 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
335a0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
335b0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
335c0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
335d0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  NAL;.          a
335e0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
335f0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
33600 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33610 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
33620 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
33630 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
33640 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
33650 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
33660 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
33670 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
33680 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
33690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
336a0 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50  & fout&SQLITE_OP
336b0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20  EN_READONLY ){. 
336c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
336d0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
336e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
336f0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
33700 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
33710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33720 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20     }.      }. . 
33730 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
33740 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
33750 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
33760 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
33770 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  e.      ** lock 
33780 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
33790 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72  e read lock. Pur
337a0 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66  ge the cache bef
337b0 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61  ore.      ** pla
337c0 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f  ying back the ho
337d0 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  t-journal so tha
337e0 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75  t we don't end u
337f0 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  p with.      ** 
33800 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
33810 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65  cache.  Sync the
33820 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66   hot journal bef
33830 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20  ore playing.    
33840 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e    ** it back sin
33850 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ce the process t
33860 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20  hat crashed and 
33870 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75  left the hot jou
33880 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72  rnal.      ** pr
33890 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73  obably did not s
338a0 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72  ync it and we ar
338b0 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c  e required to al
338c0 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20  ways sync.      
338d0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ** the journal b
338e0 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74  efore playing it
338f0 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   back..      */.
33900 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
33910 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
33920 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
33930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33940 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
33950 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
33960 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
33970 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33990 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
339a0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 21  ayback(pPager, !
339b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
339c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
339d0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
339e0 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20  GER_OPEN;.      
339f0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
33a00 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
33a10 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
33a20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63        pagerUnloc
33a30 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
33a40 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
33a50 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  }..      if( rc!
33a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33a70 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
33a80 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66  anch is taken if
33a90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
33aa0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
33ab0 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
33ac0 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   or roll back a 
33ad0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c  hot-journal whil
33ae0 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  e holding an EXC
33af0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
33b00 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
33b10 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69  r_unlock() routi
33b20 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
33b30 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
33b40 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20  ng to unlock.   
33b50 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65       ** the file
33b60 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20  . If the unlock 
33b70 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74  attempt fails, t
33b80 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  hen Pager.eLock 
33b90 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20  must be.        
33ba0 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  ** set to UNKNOW
33bb0 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20  N_LOCK (see the 
33bc0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
33bd0 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20  e #define for . 
33be0 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57         ** UNKNOW
33bf0 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72  N_LOCK above for
33c00 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29   an explanation)
33c10 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
33c20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65        ** In orde
33c30 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75  r to get pager_u
33c40 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68  nlock() to do th
33c50 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53  is, set Pager.eS
33c60 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20  tate to.        
33c70 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e  ** PAGER_ERROR n
33c80 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  ow. This is not 
33c90 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64  actually counted
33ca0 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e   as a transition
33cb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45  .        ** to E
33cc0 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68  RROR state in th
33cd0 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20  e state diagram 
33ce0 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
33cf0 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20  is file,.       
33d00 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f   ** since we kno
33d10 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  w that the same 
33d20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
33d30 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79  lock() will very
33d40 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72  .        ** shor
33d50 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  tly transition t
33d60 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
33d70 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74  to the OPEN stat
33d80 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20  e. Calling.     
33d90 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67     ** assert_pag
33da0 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64  er_state() would
33db0 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74   fail now, as it
33dc0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70   should not be p
33dd0 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
33de0 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f  ** to be in ERRO
33df0 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65  R state when the
33e00 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73  re are zero outs
33e10 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20  tanding page .  
33e20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e        ** referen
33e30 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ces..        */.
33e40 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72          pager_er
33e50 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
33e60 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
33e70 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
33e80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
33e90 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33ea0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20  ER_OPEN );.     
33eb0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
33ec0 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
33ed0 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20  LOCK).          
33ee0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
33ef0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
33f00 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52  ager->eLock>SHAR
33f10 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29  ED_LOCK).      )
33f20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
33f30 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
33f40 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68 61  le && pPager->ha
33f50 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
33f60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
33f70 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
33f80 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
33f90 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  ed then check to
33fa0 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
33fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
33fc0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
33fd0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
33fe0 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 0a 20  e has changed,. 
33ff0 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68       ** flush th
34000 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 68 61  e cache.  The ha
34010 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
34020 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68  flag prevents th
34030 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  is from.      **
34040 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20 74 68   occurring on th
34050 65 20 76 65 72 79 20 66 69 72 73 74 20 61 63 63  e very first acc
34060 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c 20 69  ess to a file, i
34070 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76 65 20  n order to save 
34080 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  a.      ** singl
34090 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 71  e unnecessary sq
340a0 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 63 61  lite3OsRead() ca
340b0 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72 74 2d  ll at the start-
340c0 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  up..      **.   
340d0 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
340e0 68 61 6e 67 65 73 20 61 72 65 20 64 65 74 65 63  hanges are detec
340f0 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
34100 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
34110 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74  ning.      ** at
34120 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
34130 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
34140 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
34150 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
34160 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
34170 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
34180 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
34190 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
341a0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  e.      ** other
341b0 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
341c0 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
341d0 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
341e0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64  n.      ** a cod
341f0 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
34200 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
34210 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
34220 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
34230 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
34240 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
34250 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
34260 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
34270 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
34280 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
34290 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ll that.      **
342a0 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
342b0 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cted..      */. 
342c0 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
342d0 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
342e0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
342f0 3b 0a 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  ;..      IOTRACE
34300 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
34310 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
34320 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
34330 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
34340 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
34350 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
34360 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
34370 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
34380 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
343a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49  if( rc!=SQLITE_I
343b0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
343c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
343d0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
343e0 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73    }.        mems
343f0 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
34400 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
34410 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ers));.      }..
34420 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
34430 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
34440 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
34450 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
34460 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rs))!=0 ){.     
34470 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
34480 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
34490 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61   /* Unmap the da
344a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
344b0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
344c0 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
344d0 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
344e0 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65  ay have truncate
344f0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
34500 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74  ile and then ext
34510 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20  ended it back.  
34520 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20        ** to its 
34530 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68  original size wh
34540 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
34550 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67   was not holding
34560 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20   a lock..       
34570 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
34580 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74   there may exist
34590 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61   a Pager.pMap ma
345a0 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61  pping that appea
345b0 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  rs.        ** to
345c0 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69   be the right si
345d0 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63  ze but is not ac
345e0 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76  tually valid. Av
345f0 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20  oid this.       
34600 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20   ** possibility 
34610 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65  by unmapping the
34620 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20   db here. */.   
34630 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43       if( USEFETC
34640 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  H(pPager) ){.   
34650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
34660 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
34670 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
34680 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34690 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
346a0 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
346b0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
346c0 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
346d0 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
346e0 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
346f0 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
34700 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
34710 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
34720 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
34730 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
34740 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  esent(pPager);.#
34750 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34760 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72  IT_WAL.    asser
34770 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  t( pPager->pWal=
34780 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
34790 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _OK );.#endif.  
347a0 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
347b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
347c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
347d0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
347e0 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
347f0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
34800 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
34810 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
34820 46 69 6c 65 3d 3d 30 20 26 26 20 70 50 61 67 65  File==0 && pPage
34830 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
34840 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c  _OPEN && rc==SQL
34850 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
34860 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
34870 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  t(pPager, &pPage
34880 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
34890 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
348a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
348b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
348c0 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
348d0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
348e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
348f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
34900 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c  ER_OPEN );.  }el
34910 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
34920 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
34930 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
34940 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
34950 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Lock = 1;.  }.  
34960 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34970 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
34980 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
34990 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
349a0 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
349b0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
349c0 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
349d0 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
349e0 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
349f0 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
34a00 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
34a10 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
34a20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
34a30 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
34a40 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
34a50 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
34a60 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
34a70 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
34a80 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
34a90 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
34aa0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
34ab0 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
34ac0 72 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r){.  if( sqlite
34ad0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
34ae0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
34af0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
34b00 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  t( pPager->nMmap
34b10 4f 75 74 3d 3d 30 20 29 3b 20 2f 2a 20 62 65 63  Out==0 ); /* bec
34b20 61 75 73 65 20 70 61 67 65 31 20 69 73 20 6e 65  ause page1 is ne
34b30 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  ver memory mappe
34b40 64 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 55 6e  d */.    pagerUn
34b50 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
34b60 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
34b70 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 67  /*.** The page g
34b80 65 74 74 65 72 20 6d 65 74 68 6f 64 73 20 65 61  etter methods ea
34b90 63 68 20 74 72 79 20 74 6f 20 61 63 71 75 69 72  ch try to acquir
34ba0 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
34bb0 20 61 0a 2a 2a 20 70 61 67 65 20 77 69 74 68 20   a.** page with 
34bc0 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
34bd0 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
34be0 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ed reference is 
34bf0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
34c00 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73   obtained, it is
34c10 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61   copied to *ppPa
34c20 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
34c30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
34c40 20 54 68 65 72 65 20 61 72 65 20 64 69 66 66 65   There are diffe
34c50 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
34c60 69 6f 6e 73 20 6f 66 20 74 68 65 20 67 65 74 74  ions of the gett
34c70 65 72 20 6d 65 74 68 6f 64 20 64 65 70 65 6e 64  er method depend
34c80 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75  ing.** on the cu
34c90 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
34ca0 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
34cb0 20 20 20 20 67 65 74 50 61 67 65 4e 6f 72 6d 61      getPageNorma
34cc0 6c 28 29 20 20 20 20 20 20 20 20 20 2d 2d 20 20  l()         --  
34cd0 54 68 65 20 6e 6f 72 6d 61 6c 20 67 65 74 74 65  The normal gette
34ce0 72 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65  r.**     getPage
34cf0 45 72 72 6f 72 28 29 20 20 20 20 20 20 20 20 20  Error()         
34d00 20 2d 2d 20 20 55 73 65 64 20 69 66 20 74 68 65   --  Used if the
34d10 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20   pager is in an 
34d20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20  error state.**  
34d30 20 20 20 67 65 74 50 61 67 65 4d 6d 61 70 28 29     getPageMmap()
34d40 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 20 55             --  U
34d50 73 65 64 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61  sed if memory-ma
34d60 70 70 65 64 20 49 2f 4f 20 69 73 20 65 6e 61 62  pped I/O is enab
34d70 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  led.**.** If the
34d80 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
34d90 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
34da0 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72  e cache, it is r
34db0 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
34dc0 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61  erwise, a new pa
34dd0 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  ge object is all
34de0 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c  ocated and popul
34df0 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a  ated with data.*
34e00 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
34e10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
34e20 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
34e30 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
34e40 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f  may.** choose no
34e50 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  t to allocate a 
34e60 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
34e70 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e  and may reuse an
34e80 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a   existing.** obj
34e90 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73  ect with no outs
34ea0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
34eb0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  es..**.** The ex
34ec0 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
34ed0 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
34ee0 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
34ef0 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a  d to zeros the .
34f00 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  ** first time a 
34f10 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
34f20 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74  nto memory. If t
34f30 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65  he page requeste
34f40 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79  d is .** already
34f50 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68   in the cache wh
34f60 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
34f70 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
34f80 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61   the extra.** da
34f90 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74  ta is left as it
34fa0 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61   was when the pa
34fb0 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61  ge object was la
34fc0 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  st used..**.** I
34fd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
34fe0 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  mage is smaller 
34ff0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
35000 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 0a 2a  ed page or if .*
35010 2a 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  * the flags para
35020 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 74  meter contains t
35030 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  he PAGER_GET_NOC
35040 4f 4e 54 45 4e 54 20 62 69 74 20 61 6e 64 20 74  ONTENT bit and t
35050 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
35060 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
35070 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74  eady stored in t
35080 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e  he cache, then n
35090 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73  o .** actual dis
350a0 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49  k read occurs. I
350b0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
350c0 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
350d0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20  the .** page is 
350e0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
350f0 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a  ll zeros. .**.**
35100 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   If PAGER_GET_NO
35110 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75 65 2c  CONTENT is true,
35120 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
35130 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
35140 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  out.** the conte
35150 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 2e  nts of the page.
35160 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
35170 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  two scenarios:.*
35180 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
35190 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
351a0 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
351b0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
351c0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
351d0 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
351e0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
351f0 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
35200 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
35210 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
35220 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65   the cache to be
35230 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
35240 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
35250 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
35260 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
35270 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45  *.** If PAGER_GE
35280 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74  T_NOCONTENT is t
35290 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
352a0 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
352b0 65 72 6f 65 64 20 69 6e 73 74 65 61 64 0a 2a 2a  eroed instead.**
352c0 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20 66   of being read f
352d0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
352e0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
352f0 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
35300 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
35310 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
35320 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
35330 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
35340 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
35350 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
35360 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
35370 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
35380 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
35390 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
353a0 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
353b0 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
353c0 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
353d0 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
353e0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
353f0 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
35400 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
35410 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
35420 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
35430 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
35440 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
35450 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
35460 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
35470 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
35480 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
35490 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
354a0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
354b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
354c0 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
354d0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
354e0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
354f0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
35500 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
35510 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
35520 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
35530 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
35540 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
35550 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
35560 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
35570 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
35580 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
35590 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
355a0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
355b0 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
355c0 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
355d0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
355e0 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
355f0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
35600 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
35610 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
35620 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
35630 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
35640 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
35650 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
35660 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
35670 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
35680 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
35690 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
356a0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   files..*/.stati
356b0 63 20 69 6e 74 20 67 65 74 50 61 67 65 4e 6f 72  c int getPageNor
356c0 6d 61 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50  mal(.  Pager *pP
356d0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
356e0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
356f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35700 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
35710 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
35720 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
35730 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
35740 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
35750 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
35760 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
35770 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
35780 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
35790 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
357a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
357b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
357c0 48 64 72 20 2a 70 50 67 3b 0a 20 20 75 38 20 6e  Hdr *pPg;.  u8 n
357d0 6f 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20  oContent;       
357e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
357f0 72 75 65 20 69 66 20 50 41 47 45 52 5f 47 45 54  rue if PAGER_GET
35800 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 73 65  _NOCONTENT is se
35810 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 70  t */.  sqlite3_p
35820 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73  cache_page *pBas
35830 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  e;..  assert( pP
35840 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
35850 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
35860 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35870 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
35880 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
35890 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
358a0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
358b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
358c0 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
358d0 6b 3d 3d 31 20 29 3b 0a 0a 23 69 66 6e 64 65 66  k==1 );..#ifndef
358e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
358f0 43 55 52 52 45 4e 54 0a 20 20 2f 2a 20 49 66 20  CURRENT.  /* If 
35900 74 68 69 73 20 69 73 20 61 6e 20 43 4f 4e 43 55  this is an CONCU
35910 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f  RRENT transactio
35920 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62  n and the page b
35930 65 69 6e 67 20 72 65 61 64 20 77 61 73 0a 20 20  eing read was.  
35940 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ** present in th
35950 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
35960 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
35970 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2c  tion was opened,
35980 0a 20 20 2a 2a 20 6d 61 72 6b 20 69 74 20 61 73  .  ** mark it as
35990 20 72 65 61 64 20 69 6e 20 74 68 65 20 70 41 6c   read in the pAl
359a0 6c 52 65 61 64 20 76 65 63 74 6f 72 2e 20 20 2a  lRead vector.  *
359b0 2f 0a 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 69  /.  pPg = 0;.  i
359c0 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52  f( pPager->pAllR
359d0 65 61 64 20 26 26 20 70 67 6e 6f 3c 3d 70 50 61  ead && pgno<=pPa
359e0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
359f0 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
35a00 45 28 28 22 55 53 49 4e 47 20 70 61 67 65 20 25  E(("USING page %
35a10 64 5c 6e 22 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  d\n", pgno));.  
35a20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
35a30 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
35a40 70 41 6c 6c 52 65 61 64 2c 20 70 67 6e 6f 29 3b  pAllRead, pgno);
35a50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
35a60 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61  ITE_OK ) goto pa
35a70 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
35a80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
35a90 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74  f( pgno==0 ) ret
35aa0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
35ab0 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65  PT_BKPT;.  pBase
35ac0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
35ad0 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
35ae0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b  Cache, pgno, 3);
35af0 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20  .  if( pBase==0 
35b00 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
35b10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35b20 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65 73  PcacheFetchStres
35b30 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
35b40 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29  e, pgno, &pBase)
35b50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
35b60 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
35b70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35b80 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 3d  ;.    if( pBase=
35b90 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
35ba0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
35bb0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
35bc0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
35be0 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71  g = *ppPage = sq
35bf0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
35c00 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
35c10 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42  PCache, pgno, pB
35c20 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ase);.  assert( 
35c30 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29  pPg==(*ppPage) )
35c40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
35c50 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
35c60 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
35c70 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
35c80 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  pPg->pPager==0 )
35c90 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d  ;..  noContent =
35ca0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
35cb0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d  GET_NOCONTENT)!=
35cc0 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  0;.  if( pPg->pP
35cd0 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
35ce0 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
35cf0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
35d00 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
35d10 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
35d20 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
35d30 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
35d40 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
35d50 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
35d60 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
35d70 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
35d80 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
35d90 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
35da0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74  .    pPager->aSt
35db0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49  at[PAGER_STAT_HI
35dc0 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  T]++;.    return
35dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
35de0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
35df0 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
35e00 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
35e10 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
35e20 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
35e30 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
35e40 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65  . But first some
35e50 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20   error checks:. 
35e60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29     **.    ** (1)
35e70 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
35e80 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
35e90 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65  .    ** (2) Neve
35ea0 72 20 74 72 79 20 74 6f 20 66 65 74 63 68 20 74  r try to fetch t
35eb0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a  he locking page.
35ec0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
35ed0 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
35ee0 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
35ef0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
35f00 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
35f10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
35f20 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
35f30 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35f40 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  r;.    }..    pP
35f50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
35f60 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  er;..    assert(
35f70 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
35f80 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29  >fd) || !MEMDB )
35f90 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  ;.    if( !isOpe
35fa0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
35fb0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
35fc0 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
35fd0 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
35fe0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
35ff0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
36000 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
36010 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
36020 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
36030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
36040 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
36050 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
36060 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
36070 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
36080 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
36090 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
360a0 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
360b0 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
360c0 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
360d0 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
360e0 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
360f0 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
36100 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
36110 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
36120 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
36130 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
36140 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
36150 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
36160 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
36170 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
36180 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
36190 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
361a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
361b0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
361c0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
361d0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
361e0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
361f0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
36200 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
36210 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
36220 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
36230 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
36240 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
36250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
36260 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
36270 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
36280 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
36290 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
362a0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
362b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
362c0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
362d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
362e0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
362f0 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
36300 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
36310 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
36320 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
36330 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
36340 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
36350 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
36360 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
36370 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
36380 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
36390 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
363a0 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b  AGER_STAT_MISS]+
363b0 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  +;.      rc = re
363c0 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
363d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
363e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
363f0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
36400 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
36410 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
36420 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
36430 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
36440 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
36450 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
36460 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
36470 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
36480 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
36490 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
364a0 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
364b0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
364c0 50 61 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67  Pager);.  *ppPag
364d0 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
364e0 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  rc;.}..#if SQLIT
364f0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
36500 30 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65  0./* The page ge
36510 74 74 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65  tter for when me
36520 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20  mory-mapped I/O 
36530 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74  is enabled */.st
36540 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65  atic int getPage
36550 4d 4d 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70  MMap(.  Pager *p
36560 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
36570 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
36580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36590 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
365a0 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
365b0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
365c0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
365d0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
365e0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
365f0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
36600 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
36610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
36620 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
36630 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
36640 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
36650 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
36660 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
36670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36680 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61   /* Frame to rea
36690 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20  d from WAL file 
366a0 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  */..  /* It is a
366b0 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
366c0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
366d0 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
366e0 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
366f0 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
36700 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
36710 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
36720 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
36730 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
36740 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
36750 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
36760 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
36770 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
36780 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
36790 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
367a0 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
367b0 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
367c0 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61  gno>1.   && (pPa
367d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
367e0 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
367f0 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f  ags & PAGER_GET_
36800 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a  READONLY)).  );.
36810 0a 20 20 61 73 73 65 72 74 28 20 55 53 45 46 45  .  assert( USEFE
36820 54 43 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23  TCH(pPager) );.#
36830 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
36840 5f 43 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28  _CODEC.  assert(
36850 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d   pPager->xCodec=
36860 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
36870 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  /* Optimization 
36880 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68  note:  Adding th
36890 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d  e "pgno<=1" term
368a0 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30   before "pgno==0
368b0 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  " here.  ** allo
368c0 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  ws the compiler 
368d0 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75  optimizer to reu
368e0 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  se the results o
368f0 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20  f the "pgno>1". 
36900 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20   ** test in the 
36910 70 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65  previous stateme
36920 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65  nt, and avoid te
36930 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e  sting pgno==0 in
36940 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e   the.  ** common
36950 20 63 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f   case where pgno
36960 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20   is large. */.  
36970 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70  if( pgno<=1 && p
36980 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
36990 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
369a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
369b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
369c0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
369d0 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
369e0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
369f0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
36a00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36a10 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
36a20 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
36a30 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
36a40 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
36a50 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  ;..  if( bMmapOk
36a60 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
36a70 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
36a80 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
36a90 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
36aa0 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
36ab0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
36ac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36ad0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
36ae0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
36af0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  c;.    }.  }.  i
36b00 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46  f( bMmapOk && iF
36b10 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76  rame==0 ){.    v
36b20 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a  oid *pData = 0;.
36b30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36b40 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  OsFetch(pPager->
36b50 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36  fd, .        (i6
36b60 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
36b70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
36b80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
36b90 20 26 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20   &pData.    );. 
36ba0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36bb0 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b  E_OK && pData ){
36bc0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
36bd0 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
36be0 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72  READER || pPager
36bf0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
36c00 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
36c10 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
36c20 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
36c30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
36c40 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
36c50 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75    rc = pagerAcqu
36c60 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65  ireMapPage(pPage
36c70 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20  r, pgno, pData, 
36c80 26 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  &pPg);.      }el
36c90 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
36ca0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
36cb0 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
36cc0 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
36cd0 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
36ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36cf0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
36d00 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
36d10 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
36d20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67     *ppPage = pPg
36d30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
36d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
36d50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
36d60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36d70 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
36d80 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
36d90 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
36da0 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50 61 67  .  return getPag
36db0 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c 20  eNormal(pPager, 
36dc0 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
36dd0 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ags);.}.#endif /
36de0 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
36df0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20  P_SIZE>0 */../* 
36e00 54 68 65 20 70 61 67 65 20 67 65 74 74 65 72 20  The page getter 
36e10 6d 65 74 68 6f 64 20 66 6f 72 20 77 68 65 6e 20  method for when 
36e20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6e 20  the pager is an 
36e30 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73  error state */.s
36e40 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
36e50 65 45 72 72 6f 72 28 0a 20 20 50 61 67 65 72 20  eError(.  Pager 
36e60 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
36e70 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
36e80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36e90 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
36ea0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
36eb0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
36ec0 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
36ed0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
36ee0 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
36ef0 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
36f00 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
36f10 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  s           /* P
36f20 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61  AGER_GET_XXX fla
36f30 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  gs */.){.  UNUSE
36f40 44 5f 50 41 52 41 4d 45 54 45 52 28 70 67 6e 6f  D_PARAMETER(pgno
36f50 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
36f60 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 20 20  METER(flags);.  
36f70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36f80 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
36f90 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  OK );.  *ppPage 
36fa0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  = 0;.  return pP
36fb0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  ager->errCode;.}
36fc0 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63 68 20 61  .../* Dispatch a
36fd0 6c 6c 20 70 61 67 65 20 66 65 74 63 68 20 72 65  ll page fetch re
36fe0 71 75 65 73 74 73 20 74 6f 20 74 68 65 20 61 70  quests to the ap
36ff0 70 72 6f 70 72 69 61 74 65 20 67 65 74 74 65 72  propriate getter
37000 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20   method..*/.int 
37010 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
37020 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
37030 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
37040 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
37050 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
37060 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
37070 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
37080 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
37090 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
370a0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
370b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
370c0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
370d0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
370e0 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
370f0 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
37100 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
37110 72 2d 3e 78 47 65 74 28 70 50 61 67 65 72 2c 20  r->xGet(pPager, 
37120 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
37130 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ags);.}../*.** A
37140 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
37150 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
37160 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
37170 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
37180 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
37190 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
371a0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
371b0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
371c0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
371d0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a   not in cache. .
371e0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
371f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
37200 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
37210 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
37220 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
37230 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
37240 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
37250 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
37260 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
37270 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
37280 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
37290 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
372a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
372b0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
372c0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
372d0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
372e0 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
372f0 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
37300 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
37310 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
37320 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
37330 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
37340 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  .  sqlite3_pcach
37350 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  e_page *pPage;. 
37360 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
37370 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
37380 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
37390 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
373a0 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61  ache!=0 );.  pPa
373b0 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ge = sqlite3Pcac
373c0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
373d0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
373e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
373f0 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ge==0 || pPager-
37400 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
37410 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ck );.  if( pPag
37420 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
37430 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
37440 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69  3PcacheFetchFini
37450 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  sh(pPager->pPCac
37460 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29  he, pgno, pPage)
37470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
37480 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
37490 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nce..**.** The s
374a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
374b0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  () and sqlite3Pa
374c0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
374d0 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 0a 2a 2a  ) may only be.**
374e0 20 75 73 65 64 20 69 66 20 77 65 20 6b 6e 6f 77   used if we know
374f0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 62   that the page b
37500 65 69 6e 67 20 72 65 6c 65 61 73 65 64 20 69 73  eing released is
37510 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 70 61   not the last pa
37520 67 65 2e 0a 2a 2a 20 54 68 65 20 62 74 72 65 65  ge..** The btree
37530 20 6c 61 79 65 72 20 61 6c 77 61 79 73 20 68 6f   layer always ho
37540 6c 64 73 20 70 61 67 65 31 20 6f 70 65 6e 20 75  lds page1 open u
37550 6e 74 69 6c 20 74 68 65 20 65 6e 64 2c 20 73 6f  ntil the end, so
37560 20 74 68 65 73 65 20 66 69 72 73 74 0a 2a 2a 20   these first.** 
37570 74 6f 20 72 6f 75 74 69 6e 65 73 20 63 61 6e 20  to routines can 
37580 62 65 20 75 73 65 64 20 74 6f 20 72 65 6c 65 61  be used to relea
37590 73 65 20 61 6e 79 20 70 61 67 65 20 6f 74 68 65  se any page othe
375a0 72 20 74 68 61 6e 20 42 74 53 68 61 72 65 64 2e  r than BtShared.
375b0 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55 73  pPage1..**.** Us
375c0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
375d0 72 65 66 50 61 67 65 4f 6e 65 28 29 20 74 6f 20  refPageOne() to 
375e0 72 65 6c 65 61 73 65 20 70 61 67 65 31 2e 20 20  release page1.  
375f0 54 68 69 73 20 6c 61 74 74 65 72 20 72 6f 75 74  This latter rout
37600 69 6e 65 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68  ine.** checks th
37610 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
37620 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  f outstanding pa
37630 67 65 73 20 61 6e 64 20 69 66 20 74 68 65 20 6e  ges and if the n
37640 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
37650 73 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 69  s reaches zero i
37660 74 20 64 72 6f 70 73 20 74 68 65 20 64 61 74 61  t drops the data
37670 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f  base lock..*/.vo
37680 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
37690 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61  nrefNotNull(DbPa
376a0 67 65 20 2a 70 50 67 29 7b 0a 20 20 54 45 53 54  ge *pPg){.  TEST
376b0 4f 4e 4c 59 28 20 50 61 67 65 72 20 2a 70 50 61  ONLY( Pager *pPa
376c0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
376d0 72 3b 20 29 0a 20 20 61 73 73 65 72 74 28 20 70  r; ).  assert( p
376e0 50 67 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  Pg!=0 );.  if( p
376f0 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
37700 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 61 73  R_MMAP ){.    as
37710 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
37720 3d 31 20 29 3b 20 20 2f 2a 20 50 61 67 65 31 20  =1 );  /* Page1 
37730 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20  is never memory 
37740 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61  mapped */.    pa
37750 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
37760 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  e(pPg);.  }else{
37770 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
37780 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
37790 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20    }.  /* Do not 
377a0 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
377b0 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
377c0 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 74  last reference t
377d0 6f 20 70 61 67 65 31 20 2a 2f 0a 20 20 61 73 73  o page1 */.  ass
377e0 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
377f0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
37800 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
37810 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
37820 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
37830 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
37840 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  g ) sqlite3Pager
37850 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67  UnrefNotNull(pPg
37860 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
37870 33 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f  3PagerUnrefPageO
37880 6e 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ne(DbPage *pPg){
37890 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
378a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ;.  assert( pPg!
378b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
378c0 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a  pPg->pgno==1 );.
378d0 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
378e0 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d  flags & PGHDR_MM
378f0 41 50 29 3d 3d 30 20 29 3b 20 2f 2a 20 50 61 67  AP)==0 ); /* Pag
37900 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f  e1 is never memo
37910 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 70  ry mapped */.  p
37920 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
37930 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ger;.  sqlite3Pa
37940 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65  gerResetLockTime
37950 6f 75 74 28 70 50 61 67 65 72 29 3b 0a 20 20 73  out(pPager);.  s
37960 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
37970 61 73 65 28 70 50 67 29 3b 0a 20 20 70 61 67 65  ase(pPg);.  page
37980 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
37990 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
379a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
379b0 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
379c0 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
379d0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
379e0 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
379f0 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
37a00 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
37a10 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
37a20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
37a30 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
37a40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
37a50 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
37a60 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
37a70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
37a80 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
37a90 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
37aa0 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
37ab0 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
37ac0 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
37ad0 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
37ae0 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
37af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
37b00 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
37b10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37b20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
37b30 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
37b40 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
37b50 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
37b60 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
37b70 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
37b80 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
37b90 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
37ba0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
37bb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
37bc0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
37bd0 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
37be0 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
37bf0 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
37c00 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
37c10 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
37c20 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
37c30 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
37c40 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
37c50 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
37c60 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
37c70 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
37c80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
37c90 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
37ca0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
37cb0 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
37cc0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
37cd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
37ce0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
37cf0 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
37d00 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
37d10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
37d20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
37d30 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
37d40 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
37d50 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
37d60 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
37d70 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
37d80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
37d90 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
37da0 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
37db0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
37dc0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
37dd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
37de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37df0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
37e00 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
37e10 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
37e20 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
37e30 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
37e40 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
37e50 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
37e60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37e70 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
37e80 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
37e90 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37ea0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
37eb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37ec0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
37ed0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
37ee0 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
37ef0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
37f00 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
37f10 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
37f20 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
37f30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
37f40 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
37f50 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
37f60 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
37f70 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
37f80 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
37f90 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
37fa0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
37fb0 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
37fc0 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
37fd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
37fe0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
37ff0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
38000 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
38010 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
38020 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
38030 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
38040 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
38050 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
38060 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
38070 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
38080 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
38090 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
380a0 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
380b0 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
380c0 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
380d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
380e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
380f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
38100 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
38110 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
38120 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
38130 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
38140 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
38150 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
38160 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
38170 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
38180 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
38190 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  ;.        int nS
381a0 70 69 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69  pill;..        i
381b0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
381c0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ile ){.         
381d0 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54   flags |= (SQLIT
381e0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
381f0 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
38200 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _TEMP_JOURNAL);.
38210 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c            nSpill
38220 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67   = sqlite3Config
38230 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20  .nStmtSpill;.   
38240 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
38250 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
38260 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
38270 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
38280 20 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c     nSpill = jrnl
38290 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
382a0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
382b0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
382c0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
382d0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69  the database sti
382e0 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ll has the same 
382f0 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77  name as it did w
38300 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hen.        ** i
38310 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  t was originally
38320 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
38330 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73      rc = databas
38340 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65  eIsUnmoved(pPage
38350 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
38360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
38370 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
38380 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
38390 65 6e 20 28 0a 20 20 20 20 20 20 20 20 20 20 20  en (.           
383a0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
383b0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
383c0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e  r->jfd, flags, n
383d0 53 70 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  Spill.          
383e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
383f0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
38400 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
38410 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
38420 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d  r->jfd) );.    }
38430 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72  .  .  .    /* Wr
38440 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
38450 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
38460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
38470 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a   and open .    *
38480 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
38490 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
384a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
384b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
384c0 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43        /* TODO: C
384d0 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74  heck if all of t
384e0 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20  hese are really 
384f0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
38500 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
38510 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
38520 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
38530 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
38540 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
38550 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
38560 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
38570 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
38580 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
38590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
385a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
385b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
385c0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
385d0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
385e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
385f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
38600 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
38610 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
38620 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
38630 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50  LOCKED );.    pP
38640 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
38650 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
38660 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  EMOD;.  }..  ret
38670 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
38680 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
38690 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
386a0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
386b0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
386c0 2a 2a 20 77 72 69 74