/ Hex Artifact Content
Login

Artifact 94a8f8f56a5c643128a766c41c79af185ccb49eb7348acf52b040267aacbaa19:


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 33 5d 3b 20 20 20 20 20 20 20  aStat[3];       
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 20 61 6e 64 20 77 72 69 74 65 73 20 2a  ses and writes *
86b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
86c0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64  TEST.  int nRead
86d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
86e0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
86f0: 61 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e  ages read */.#en
8700: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65  dif.  void (*xRe
8710: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
8720: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
8730: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
8740: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20  ading pages */. 
8750: 20 69 6e 74 20 28 2a 78 47 65 74 29 28 50 61 67   int (*xGet)(Pag
8760: 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a  er*,Pgno,DbPage*
8770: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  *,int); /* Routi
8780: 6e 65 20 74 6f 20 66 65 74 63 68 20 61 20 70 61  ne to fetch a pa
8790: 74 63 68 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  tch */.#ifdef SQ
87a0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
87b0: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
87c0: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
87d0: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
87e0: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
87f0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
8800: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
8810: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
8820: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
8830: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8840: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8850: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8860: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
8870: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
8880: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
8890: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
88b0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
88c0: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
88d0: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
88e0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
88f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8900: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
8910: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
8920: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
8930: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8940: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8950: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8960: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
8970: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8980: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89a0: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
89b0: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
89c0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
89d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89f0: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
8a00: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
8a10: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
8a20: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
8a30: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
8a40: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
8a50: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
8a60: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
8a70: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
8a80: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
8a90: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8aa0: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8ab0: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8ac0: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8ad0: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
8ae0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8af0: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
8b00: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
8b10: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
8b20: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
8b30: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
8b40: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8b50: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8b60: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8b70: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8b80: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8b90: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8ba0: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8bb0: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8bc0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8bd0: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
8be0: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
8bf0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
8c00: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8c10: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
8c20: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8c30: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8c40: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8c50: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8c60: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8c70: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8c80: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8c90: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8ca0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8cb0: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8cc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8cd0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
8ce0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
8cf0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
8d00: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
8d10: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8d20: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
8d30: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8d40: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8d50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8d60: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8d70: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8d80: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8d90: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8da0: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8db0: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8dc0: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8dd0: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8de0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8df0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8e00: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8e10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8e20: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8e30: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8e40: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8e50: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8e60: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8e70: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8e80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8e90: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8ea0: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8eb0: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8ec0: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8ed0: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8ee0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8ef0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8f00: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8f10: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8f20: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8f30: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8f40: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8f50: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8f60: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8f70: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8f80: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8f90: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8fa0: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8fb0: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8fc0: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8fd0: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8fe0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8ff0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
9000: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
9010: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
9020: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
9030: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
9040: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
9050: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
9060: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
9070: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
9080: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
9090: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
90a0: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
90b0: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
90c0: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
90d0: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
90e0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
90f0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
9100: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
9110: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
9120: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
9130: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
9140: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
9150: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
9160: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
9170: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
9180: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
9190: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
91a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
91b0: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
91c0: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
91d0: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
91e0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
91f0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
9200: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
9210: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
9220: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
9230: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
9240: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9250: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
9260: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
9270: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
9280: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
9290: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
92a0: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
92b0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
92c0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
92d0: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
92e0: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
92f0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
9300: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
9310: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
9320: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
9330: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9340: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9350: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9360: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9370: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
9380: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
9390: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
93a0: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
93b0: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
93c0: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
93d0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
93e0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
93f0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
9400: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
9410: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
9420: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
9430: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9440: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9450: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9460: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9470: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
9480: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
9490: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
94a0: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
94b0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
94c0: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
94d0: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
94e0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
94f0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
9500: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
9510: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9520: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
9530: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9540: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9550: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9560: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9570: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
9580: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
9590: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
95a0: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
95b0: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
95c0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
95d0: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
95e0: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
95f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
9600: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
9610: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
9620: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
9630: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9640: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9650: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9660: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9670: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
9680: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
9690: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
96a0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
96b0: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
96c0: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
96d0: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
96e0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
96f0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
9700: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
9710: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
9720: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
9730: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9740: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9750: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9760: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9770: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
9780: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9790: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
97a0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
97b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
97c0: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
97d0: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
97e0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
97f0: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
9800: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
9810: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20  e if this pager 
9820: 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65  uses a write-ahe
9830: 61 64 20 6c 6f 67 20 74 6f 20 72 65 61 64 20 70  ad log to read p
9840: 61 67 65 20 70 67 6e 6f 2e 0a 2a 2a 20 52 65 74  age pgno..** Ret
9850: 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65  urn false if the
9860: 20 70 61 67 65 72 20 72 65 61 64 73 20 70 67 6e   pager reads pgn
9870: 6f 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  o directly from 
9880: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
9890: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
98a0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 26  LITE_OMIT_WAL) &
98b0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
98c0: 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
98d0: 5f 52 45 41 44 29 0a 69 6e 74 20 73 71 6c 69 74  _READ).int sqlit
98e0: 65 33 50 61 67 65 72 55 73 65 57 61 6c 28 50 61  e3PagerUseWal(Pa
98f0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
9900: 6f 20 70 67 6e 6f 29 7b 0a 20 20 75 33 32 20 69  o pgno){.  u32 i
9910: 52 65 61 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Read = 0;.  int 
9920: 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
9930: 2d 3e 70 57 61 6c 3d 3d 30 20 29 20 72 65 74 75  ->pWal==0 ) retu
9940: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c  rn 0;.  rc = sql
9950: 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
9960: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
9970: 67 6e 6f 2c 20 26 69 52 65 61 64 29 3b 0a 20 20  gno, &iRead);.  
9980: 72 65 74 75 72 6e 20 72 63 20 7c 7c 20 69 52 65  return rc || iRe
9990: 61 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ad;.}.#endif.#if
99a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
99b0: 5f 57 41 4c 0a 23 20 64 65 66 69 6e 65 20 70 61  _WAL.# define pa
99c0: 67 65 72 55 73 65 57 61 6c 28 78 29 20 28 28 78  gerUseWal(x) ((x
99d0: 29 2d 3e 70 57 61 6c 21 3d 30 29 0a 23 65 6c 73  )->pWal!=0).#els
99e0: 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
99f0: 55 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65  UseWal(x) 0.# de
9a00: 66 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61  fine pagerRollba
9a10: 63 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  ckWal(x) 0.# def
9a20: 69 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d  ine pagerWalFram
9a30: 65 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20  es(v,w,x,y) 0.# 
9a40: 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e  define pagerOpen
9a50: 57 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20  WalIfPresent(z) 
9a60: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
9a70: 6e 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  ne pagerBeginRea
9a80: 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20  dTransaction(z) 
9a90: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
9aa0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
9ab0: 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a   ./*.** Usage:.*
9ac0: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61  *.**   assert( a
9ad0: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
9ae0: 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a  e(pPager) );.**.
9af0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9b00: 20 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72   runs many asser
9b10: 74 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e  ts to try to fin
9b20: 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65  d inconsistencie
9b30: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65  s in.** the inte
9b40: 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
9b50: 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a  e Pager object..
9b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73  */.static int as
9b70: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
9b80: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61  (Pager *p){.  Pa
9b90: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b  ger *pPager = p;
9ba0: 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73  ..  /* State mus
9bb0: 74 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20  t be valid. */. 
9bc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61   assert( p->eSta
9bd0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20  te==PAGER_OPEN. 
9be0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9bf0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
9c00: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9c10: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9c20: 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
9c30: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9c40: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
9c50: 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
9c60: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9c70: 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20  WRITER_DBMOD.   
9c80: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9c90: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
9ca0: 49 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c  INISHED.       |
9cb0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9cc0: 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20  ER_ERROR.  );.. 
9cd0: 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f   /* Regardless o
9ce0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
9cf0: 61 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65  ate, a temp-file
9d00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61   connection alwa
9d10: 79 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20  ys behaves.  ** 
9d20: 61 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20  as if it has an 
9d30: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
9d40: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
9d50: 69 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70  ile. It never up
9d60: 64 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63  dates.  ** the c
9d70: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69  hange-counter fi
9d80: 65 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e  eld, so the chan
9d90: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
9da0: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a   is always set..
9db0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9dc0: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9dd0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
9de0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  SIVE_LOCK );.  a
9df0: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9e00: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
9e10: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
9e20: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
9e30: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67   useJournal flag
9e40: 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a   is clear, the j
9e50: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74  ournal-mode must
9e60: 20 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a   be "OFF". .  **
9e70: 20 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72   And if the jour
9e80: 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46  nal-mode is "OFF
9e90: 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ", the journal f
9ea0: 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ile must not be 
9eb0: 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  open..  */.  ass
9ec0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9ed0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9ee0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d  ALMODE_OFF || p-
9ef0: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
9f00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
9f10: 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
9f20: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9f30: 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  | !isOpen(p->jfd
9f40: 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
9f50: 20 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c   that MEMDB impl
9f60: 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20  ies noSync. And 
9f70: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
9f80: 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a  rnal. Since .  *
9f90: 2a 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20  * this means an 
9fa0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
9fb0: 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61  performs no IO a
9fc0: 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74  t all, it cannot
9fd0: 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a   encounter .  **
9fe0: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49   either SQLITE_I
9ff0: 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46  OERR or SQLITE_F
a000: 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ULL during rollb
a010: 61 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e  ack or while fin
a020: 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20  alizing .  ** a 
a030: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61  journal file. (a
a040: 6c 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d  lthough the in-m
a050: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d  emory journal im
a060: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
a070: 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51   .  ** return SQ
a080: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
a090: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
a0a0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
a0b0: 20 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20   written). It . 
a0c0: 20 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65   ** is therefore
a0d0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
a0e0: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r an in-memory p
a0f0: 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
a100: 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74  e ERROR .  ** st
a110: 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ate..  */.  if( 
a120: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73  MEMDB ){.    ass
a130: 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 2d 3e  ert( !isOpen(p->
a140: 66 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  fd) );.    asser
a150: 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a  t( p->noSync );.
a160: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a      assert( p->j
a170: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a180: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a190: 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  F .         || p
a1a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a1b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a1c0: 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a  _MEMORY .    );.
a1d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a1e0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
a1f0: 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21  OR && p->eState!
a200: 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
a210: 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
a220: 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a  UseWal(p)==0 );.
a230: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61    }..  /* If cha
a240: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20  ngeCountDone is 
a250: 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44 20  set, a RESERVED 
a260: 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
a270: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a  must be held.  *
a280: 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20  * on the file.. 
a290: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
a2a0: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
a2b0: 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67  tDone==0 || pPag
a2c0: 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  er->eLock>=RESER
a2d0: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
a2e0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a2f0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
a300: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53  .  switch( p->eS
a310: 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65  tate ){.    case
a320: 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20   PAGER_OPEN:.   
a330: 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
a340: 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  B );.      asser
a350: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a360: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a370: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
a380: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
a390: 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
a3a0: 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67  ache)==0 || pPag
a3b0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
a3c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a3d0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41    case PAGER_REA
a3e0: 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72  DER:.      asser
a3f0: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a400: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a410: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a420: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
a430: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a440: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a450: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
a460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a470: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a480: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20  TER_LOCKED:.    
a490: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a4a0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
a4b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a4c0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a4d0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a4e0: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
a4f0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a500: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a510: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ( p->eLock>=RESE
a520: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RVED_LOCK );.   
a530: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
a540: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
a550: 45 4e 54 0a 20 20 20 20 20 20 61 73 73 65 72 74  ENT.      assert
a560: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
a570: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ==pPager->dbOrig
a580: 53 69 7a 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Size || pPager->
a590: 70 41 6c 6c 52 65 61 64 20 29 3b 0a 23 65 6e 64  pAllRead );.#end
a5a0: 69 66 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  if.      assert(
a5b0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a5c0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a5d0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a5e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a5f0: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a600: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
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 73 65 74 4d 61 73 74   pPager->setMast
a630: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a640: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a650: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a660: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a670: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a680: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a690: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a6a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a6b0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a6c0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a6d0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a6e0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a6f0: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a700: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a710: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a720: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a730: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a740: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a750: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a760: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a770: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a780: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a790: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a7a0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a7b0: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a7c0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a7d0: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a7e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a7f0: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a800: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a810: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a820: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a830: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a840: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a850: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a870: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a880: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a890: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a8a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a8b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a8c0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a8d0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a8e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a8f0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a900: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a910: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a920: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a930: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a940: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a950: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a960: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a970: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a980: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a990: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a9a0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a9b0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a9c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a9d0: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a9e0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a9f0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
aa00: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
aa10: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
aa20: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aa30: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
aa40: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
aa50: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
aa60: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
aa70: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L .           ||
aa80: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
aa90: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
aaa0: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
aab0: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
aac0: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
aad0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aae0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
aaf0: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
ab00: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
ab10: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
ab20: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
ab30: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
ab40: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
ab50: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
ab60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
ab70: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
ab80: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ab90: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
aba0: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
abb0: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
abc0: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
abd0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
abe0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
abf0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ac00: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ac10: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ac20: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ac30: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
ac40: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
ac50: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
ac60: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
ac70: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
ac80: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
ac90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
aca0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
acb0: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
acc0: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
acd0: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ace0: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
acf0: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ad00: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ad10: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ad20: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
ad30: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
ad40: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
ad50: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
ad60: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
ad70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
ad80: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ad90: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ada0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
adb0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
adc0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
add0: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ade0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
adf0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ae00: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ae10: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ae20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ae30: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
ae40: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ae50: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
ae60: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
ae70: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
ae80: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ae90: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
aea0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
aeb0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
aec0: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
aed0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
aee0: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
aef0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
af00: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
af10: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
af20: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
af30: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
af40: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
af50: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
af60: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
af70: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
af80: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
af90: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
afa0: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
afb0: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
afc0: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
afd0: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
afe0: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
aff0: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
b000: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
b010: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
b020: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
b030: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
b040: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
b050: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
b060: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
b070: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
b080: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
b090: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
b0a0: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
b0b0: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b0c0: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
b0d0: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
b0e0: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
b0f0: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
b100: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
b110: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
b120: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
b130: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
b140: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
b150: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
b160: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
b170: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
b180: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
b190: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
b1a0: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
b1b0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b1c0: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
b1d0: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
b1e0: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
b1f0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b200: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
b210: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
b220: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b230: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b240: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
b250: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
b260: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b270: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
b280: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
b290: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
b2a0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
b2b0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
b2c0: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
b2d0: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
b2e0: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b2f0: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
b300: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
b310: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
b320: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
b330: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
b340: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
b350: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
b360: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
b370: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
b380: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
b390: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
b3a0: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
b3b0: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
b3c0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
b3d0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
b3e0: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
b3f0: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
b400: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
b410: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
b420: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
b430: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b440: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b450: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
b460: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
b470: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b480: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b490: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
b4a0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b4b0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b4c0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
b4d0: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
b4e0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b4f0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b500: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
b510: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
b520: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
b530: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b540: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
b550: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
b560: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
b570: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b580: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b590: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
b5a0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
b5b0: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
b5c0: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
b5d0: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
b5e0: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
b5f0: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
b600: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
b610: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
b620: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
b630: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
b640: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
b650: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
b660: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  t;.}.#endif../* 
b670: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
b680: 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  es to the variou
b690: 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20 2a  s page getters *
b6a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
b6b0: 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72  PageNormal(Pager
b6c0: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b6d0: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
b6e0: 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50 61   getPageError(Pa
b6f0: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b700: 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c  **,int);.#if SQL
b710: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
b720: 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67  E>0.static int g
b730: 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72  etPageMMap(Pager
b740: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b750: 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  int);.#endif../*
b760: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67 65  .** Set the Page
b770: 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f  r.xGet method fo
b780: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
b790: 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  e routine used t
b7a0: 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65  o fetch.** conte
b7b0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
b7c0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b7d0: 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f  d setGetterMetho
b7e0: 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
b7f0: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
b800: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70  errCode ){.    p
b810: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b820: 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20  tPageError;.#if 
b830: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
b840: 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69  SIZE>0.  }else i
b850: 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
b860: 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er).#ifdef SQLIT
b870: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26  E_HAS_CODEC.   &
b880: 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  & pPager->xCodec
b890: 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ==0.#endif.  ){.
b8a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b8b0: 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a   = getPageMMap;.
b8c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b8d0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
b8e0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
b8f0: 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20   pPager->xGet = 
b900: 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20  getPageNormal;. 
b910: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b920: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
b930: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
b940: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
b950: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
b960: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
b970: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
b980: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
b990: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
b9a0: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
b9b0: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
b9c0: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
b9d0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
b9e0: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
b9f0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
ba00: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
ba10: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
ba20: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
ba30: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
ba40: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
ba50: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
ba60: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
ba70: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
ba80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
ba90: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
baa0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
bab0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
bac0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67  g->pPager;.  Pag
bad0: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a  erSavepoint *p;.
bae0: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
baf0: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69  g->pgno;.  int i
bb00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
bb10: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
bb20: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  t; i++){.    p =
bb30: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
bb40: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
bb50: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
bb60: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
bb70: 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70  vecTestNotNull(p
bb80: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bb90: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
bba0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bbb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bbc0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
bbd0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
bbe0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
bbf0: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
bc00: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
bc10: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
bc20: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
bc30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
bc40: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
bc50: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
bc60: 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
bc70: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
bc80: 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pgno);.}.#endif.
bc90: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
bca0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
bcb0: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
bcc0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
bcd0: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
bce0: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
bcf0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
bd00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
bd10: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
bd20: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
bd30: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
bd40: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
bd50: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
bd60: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
bd70: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
bd80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bd90: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
bda0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
bdb0: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
bdc0: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
bdd0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
bde0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
bdf0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
be00: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
be10: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
be20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
be30: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
be40: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
be50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
be60: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
be70: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
be80: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
be90: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
bea0: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
beb0: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
bec0: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
bed0: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
bee0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
bef0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
bf00: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
bf10: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
bf20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
bf30: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
bf40: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
bf50: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
bf60: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
bf70: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
bf80: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
bf90: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
bfa0: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
bfb0: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
bfc0: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
bfd0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
bfe0: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
bff0: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
c000: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
c010: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
c020: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
c030: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
c040: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
c050: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
c060: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
c070: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
c080: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
c090: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
c0a0: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
c0b0: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
c0c0: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
c0d0: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
c0e0: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
c0f0: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
c100: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
c110: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
c120: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
c130: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c140: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
c150: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
c160: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
c170: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
c180: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
c190: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c1a0: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
c1b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c1c0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
c1d0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c1e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
c1f0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
c200: 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
c210: 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock==eLock );. 
c220: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
c230: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  NO_LOCK || eLock
c240: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c250: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c260: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67  !=NO_LOCK || pag
c270: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c280: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
c290: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c2a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c2b0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
c2c0: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
c2d0: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c2e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c2f0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
c300: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
c310: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c320: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c330: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
c340: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c350: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  8)eLock;.    }. 
c360: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
c370: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c380: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c390: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c3a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c3b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c3c0: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
c3d0: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
c3e0: 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  her SHARED_LOCK,
c3f0: 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  .** RESERVED_LOC
c400: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
c410: 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  OCK. If the call
c420: 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  er is successful
c430: 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67  , set the.** Pag
c440: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
c450: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63  e to the new loc
c460: 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  king state. .**.
c470: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c480: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c490: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c4a0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c4b0: 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65  ion is .** calle
c4c0: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
c4d0: 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e   it unless the n
c4e0: 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ew locking state
c4f0: 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   is EXCLUSIVE_LO
c500: 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20  CK. .** See the 
c510: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c520: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b  e #define of UNK
c530: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c540: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a   explanation .**
c550: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c560: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63  tic int pagerLoc
c570: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
c580: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
c590: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c5a0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
c5b0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c5c0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53  CK || eLock==RES
c5d0: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  ERVED_LOCK || eL
c5e0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c5f0: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
c600: 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b  ger->eLock<eLock
c610: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
c620: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
c630: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
c640: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
c650: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
c660: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
c670: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
c680: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c690: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
c6a0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
c6b0: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
c6c0: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
c6d0: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c6e0: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c6f0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
c700: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c710: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
c720: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
c730: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
c740: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
c750: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
c760: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
c770: 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d 69  rite or.** atomi
c780: 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70  c-batch-write op
c790: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20  timizations can 
c7a0: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
c7b0: 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a 20  s pager. The.** 
c7c0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
c7d0: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
c7e0: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
c7f0: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
c800: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
c810: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c820: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
c830: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
c840: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
c850: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
c860: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
c870: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
c880: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
c890: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
c8a0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
c8b0: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
c8c0: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e size..**.** If
c8d0: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c8e0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c8f0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
c900: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c910: 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  nal .** file whe
c920: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72 6f  n it contains ro
c930: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
c940: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
c950: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f 6d  ..**.** The atom
c960: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c970: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
c980: 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65 76  be used if OsDev
c990: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c9a0: 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20  cs().** returns 
c9b0: 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68 65  a value with the
c9c0: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
c9d0: 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20 73  TCH_ATOMIC bit s
c9e0: 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65 74  et. -1 is.** ret
c9f0: 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
ca00: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  se..**.** If nei
ca10: 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
ca20: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 30  n can be used, 0
ca30: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
ca40: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
ca50: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
ca60: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
ca70: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
ca80: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
ca90: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
caa0: 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65  _WRITE) \. || de
cab0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
cac0: 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
cad0: 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64 63  _WRITE).  int dc
cae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
cb00: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
cb10: 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65  stics */..  asse
cb20: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
cb30: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20 3d  r->fd) );.  dc =
cb40: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
cb50: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
cb60: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65 6e  pPager->fd);.#en
cb70: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
cb80: 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
cb90: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 69  ATOMIC_WRITE.  i
cba0: 66 28 20 64 63 26 53 51 4c 49 54 45 5f 49 4f 43  f( dc&SQLITE_IOC
cbb0: 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20  AP_BATCH_ATOMIC 
cbc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  ){.    return -1
cbd0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
cbe0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cbf0: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
cc00: 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 65 63    {.    int nSec
cc10: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
cc20: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 69 6e  ctorSize;.    in
cc30: 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65  t szPage = pPage
cc40: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20  r->pageSize;..  
cc50: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
cc60: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
cc70: 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20  =(512>>8));.    
cc80: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
cc90: 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
cca0: 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
ccb0: 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49  if( 0==(dc&(SQLI
ccc0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
ccd0: 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20  (szPage>>8)) || 
cce0: 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20  nSector>szPage) 
ccf0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cd00: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
cd10: 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48  return JOURNAL_H
cd20: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
cd30: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
cd40: 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ager);.#endif.. 
cd50: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
cd60: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
cd70: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
cd80: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
cd90: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
cda0: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
cdb0: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
cdc0: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
cdd0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
cde0: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
cdf0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
ce00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
ce10: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
ce20: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
ce30: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
ce40: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
ce50: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
ce60: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
ce70: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
ce80: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
ce90: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
cea0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
ceb0: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
cec0: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
ced0: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
cee0: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
cef0: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
cf00: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
cf10: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
cf20: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
cf30: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
cf40: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
cf50: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
cf60: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
cf70: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
cf80: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
cf90: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
cfa0: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
cfb0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
cfc0: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
cfd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
cfe0: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
cff0: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
d000: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
d010: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
d020: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
d030: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
d040: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
d050: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
d060: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
d070: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
d080: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
d090: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
d0a0: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
d0b0: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
d0c0: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
d0d0: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
d0e0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
d0f0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
d100: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
d110: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
d120: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d130: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
d140: 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
d150: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
d160: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
d170: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
d180: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
d190: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
d1a0: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
d1b0: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
d1c0: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
d1d0: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
d1e0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
d1f0: 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48  sh(X).#define CH
d200: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
d210: 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48  if  /* SQLITE_CH
d220: 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a  ECK_PAGES */../*
d230: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
d240: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
d250: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
d260: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
d270: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20  e open..** This 
d280: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
d290: 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74  s to read a mast
d2a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d2b0: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  name from the .*
d2c0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
d2d0: 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73  e and, if succes
d2e0: 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20  sful, copies it 
d2f0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
d300: 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  lied .** by the 
d310: 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d  caller. See comm
d320: 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65  ents above write
d330: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
d340: 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  for the format.*
d350: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
d360: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
d370: 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68   file name at th
d380: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
d390: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a  al file..**.** z
d3a0: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
d3b0: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
d3c0: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
d3d0: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
d3e0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
d3f0: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
d400: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
d410: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
d420: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
d430: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
d440: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
d450: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d460: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
d470: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
d480: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
d490: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
d4a0: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
d4b0: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
d4c0: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
d4d0: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
d4e0: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
d4f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
d500: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
d510: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
d520: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  **.** If a maste
d530: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
d540: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61  ame is present a
d550: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
d560: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
d570: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  , then it is cop
d580: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ied into the buf
d590: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
d5a0: 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20  y zMaster. A.** 
d5b0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
d5c0: 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20  yte is appended 
d5d0: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  to the buffer fo
d5e0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74  llowing the mast
d5f0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
d600: 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  le name..**.** I
d610: 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e  f it is determin
d620: 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65  ed that no maste
d630: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
d640: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a  ame is present .
d650: 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  ** zMaster[0] is
d660: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
d670: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
d680: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
d690: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
d6a0: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
d6b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
d6c0: 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
d6d0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
d6e0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
d6f0: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
d700: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
d710: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
d720: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
d730: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
d760: 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  de */.  u32 len;
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20     /* Length in 
d790: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20  bytes of master 
d7a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
d7b0: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d7d0: 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79  Total size in by
d7e0: 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  tes of journal f
d7f0: 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75  ile pJrnl */.  u
d800: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
d810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20            /* MJ 
d820: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72  checksum value r
d830: 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ead from journal
d840: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
d870: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
d880: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
d890: 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62  gic[8];   /* A b
d8a0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
d8b0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
d8c0: 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  /.  zMaster[0] =
d8d0: 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51   '\0';..  if( SQ
d8e0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d8f0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d900: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20  (pJrnl, &szJ)). 
d910: 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c    || szJ<16.   |
d920: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d930: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
d940: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
d950: 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e  n)).   || len>=n
d960: 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65  Master .   || le
d970: 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49  n==0 .   || SQLI
d980: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
d990: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
d9a0: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
d9b0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d9c0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d9d0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
d9e0: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
d9f0: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
da00: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
da10: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
da20: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
da30: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
da40: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
da50: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
da60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
da70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
da80: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
da90: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
daa0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
dab0: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
dac0: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
dad0: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
dae0: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
daf0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
db00: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
db10: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
db20: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
db30: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
db40: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
db50: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
db60: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
db70: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
db80: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
db90: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
dba0: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
dbb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
dbc0: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
dbd0: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
dbe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
dbf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
dc00: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
dc10: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
dc20: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
dc30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
dc40: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
dc50: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
dc60: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
dc70: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
dc80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
dc90: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
dca0: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
dcb0: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
dcc0: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
dcd0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
dce0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
dcf0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
dd00: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
dd10: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
dd20: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
dd30: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
dd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd60: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
ddd0: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
dde0: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
ddf0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
de00: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
de10: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
de20: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
de30: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
de40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
de50: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
de60: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
de70: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
de80: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
de90: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
dea0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
deb0: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
dec0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ded0: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
dee0: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
def0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
df00: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
df10: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
df20: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
df30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
df40: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
df50: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
df60: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
df70: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
df80: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
df90: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
dfa0: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
dfb0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
dfc0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
dfd0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
dfe0: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
dff0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
e000: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
e010: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
e020: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
e030: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
e040: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
e050: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
e060: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
e070: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
e080: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
e090: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
e0a0: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
e0b0: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
e0c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
e0d0: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
e0e0: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
e0f0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
e100: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
e110: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
e120: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
e130: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
e140: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
e150: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
e160: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
e170: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
e180: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
e190: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
e1a0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
e1b0: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
e1c0: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
e1d0: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
e1e0: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
e1f0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
e200: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
e210: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
e220: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
e230: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
e240: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
e250: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
e260: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
e270: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
e280: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
e290: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
e2a0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
e2b0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
e2c0: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
e2d0: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
e2e0: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
e2f0: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
e300: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
e310: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
e320: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
e330: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
e340: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
e350: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e360: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
e390: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
e3a0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
e3b0: 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
e3c0: 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e  t( !sqlite3Journ
e3d0: 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
e3e0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
e3f0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
e400: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
e410: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
e420: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
e430: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
e440: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
e450: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
e460: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
e470: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
e480: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
e490: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
e4a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e4b0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
e4c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
e4d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e4e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
e4f0: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
e500: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
e510: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
e520: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
e530: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
e540: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
e550: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e560: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
e570: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
e580: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e590: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
e5a0: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
e5b0: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
e5c0: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
e5d0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
e5e0: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
e5f0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
e600: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
e610: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
e620: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
e630: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
e640: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
e650: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
e660: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
e670: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
e680: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
e690: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
e6a0: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
e6b0: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
e6c0: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
e6d0: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
e6e0: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
e6f0: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
e700: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
e710: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
e720: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
e730: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
e740: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
e750: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
e760: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
e770: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
e780: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
e790: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
e7a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e7b0: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
e7c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e7d0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
e7e0: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
e7f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
e820: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
e830: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
e840: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e850: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
e860: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
e870: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
e880: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
e890: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e8a0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
e8b0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
e8c0: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
e8d0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
e8e0: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
e8f0: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
e900: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
e910: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
e920: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
e930: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
e940: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
e950: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
e960: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
e970: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
e980: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
e990: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
e9a0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
e9b0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
e9c0: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
e9d0: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
e9e0: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
e9f0: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
ea00: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
ea10: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
ea20: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
ea30: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
ea40: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
ea50: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
ea60: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
ea70: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
ea80: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
ea90: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
eaa0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
eab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
eac0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
ead0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
eae0: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
eaf0: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
eb00: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
eb10: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
eb20: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
eb30: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
eb40: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
eb50: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
eb60: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
eb70: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
eb80: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
eba0: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
ebb0: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
ebc0: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
ebf0: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
ec00: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
ec10: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
ec20: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
ec30: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
ec40: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
ec50: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
ec60: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
ec70: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
ec80: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
ec90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
eca0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
ecb0: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
ecc0: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
ecd0: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
ece0: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
ecf0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
ed00: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
ed10: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
ed20: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
ed30: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
ed40: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
ed50: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
ed60: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
ed70: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
ed80: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
ed90: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
eda0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
edb0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
edc0: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
edd0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ede0: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
edf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
ee00: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
ee10: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
ee20: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
ee30: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
ee40: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
ee50: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
ee60: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
ee70: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
ee80: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
ee90: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
eea0: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
eeb0: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
eec0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
eed0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
eee0: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
eef0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
ef00: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
ef10: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
ef20: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
ef30: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
ef40: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
ef50: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
ef60: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
ef70: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
ef80: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
ef90: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
efa0: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
efb0: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
efc0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
efd0: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
efe0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
eff0: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
f000: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
f010: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
f020: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
f030: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
f040: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
f050: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
f060: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
f070: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
f080: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
f090: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
f0a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
f0b0: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
f0c0: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
f0d0: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
f0e0: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
f0f0: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
f100: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
f110: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
f120: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
f130: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
f140: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
f150: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
f160: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
f170: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
f180: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
f190: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
f1a0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
f1b0: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
f1c0: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
f1d0: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
f1e0: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
f1f0: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
f200: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
f210: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
f220: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
f230: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
f240: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
f250: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
f260: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
f270: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
f280: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
f290: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
f2a0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
f2b0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
f2c0: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
f2d0: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
f2e0: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
f2f0: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
f300: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
f310: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f320: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
f330: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
f340: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f350: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
f360: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
f370: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
f380: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
f390: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
f3a0: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
f3b0: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
f3c0: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
f3d0: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
f3e0: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
f3f0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
f400: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
f410: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
f420: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f430: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
f440: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f450: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
f460: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
f470: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
f480: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
f490: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f4a0: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
f4b0: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
f4c0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
f4d0: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
f4e0: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
f4f0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
f500: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f510: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
f520: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
f530: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
f540: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
f550: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
f560: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f570: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
f580: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
f590: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
f5a0: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
f5b0: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
f5c0: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
f5d0: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
f5e0: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
f5f0: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
f600: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
f610: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
f620: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
f630: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
f640: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
f650: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
f660: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
f670: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
f680: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
f690: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f6a0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
f6b0: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
f6c0: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
f6d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
f6e0: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
f6f0: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
f700: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
f710: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
f720: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
f730: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
f740: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
f750: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
f760: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
f770: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
f780: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
f790: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
f7a0: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
f7b0: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
f7c0: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
f7d0: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
f7e0: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
f7f0: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
f800: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
f810: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
f820: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
f830: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
f840: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
f850: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
f860: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
f870: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
f880: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
f890: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
f8a0: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
f8b0: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
f8c0: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
f8d0: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
f8e0: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
f8f0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
f900: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
f910: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
f920: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
f930: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
f940: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
f950: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
f960: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
f970: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
f980: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
f990: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
f9a0: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
f9b0: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
f9c0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
f9d0: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
f9e0: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
f9f0: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
fa00: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
fa10: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
fa20: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
fa30: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
fa40: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
fa50: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
fa60: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
fa70: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
fa80: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
fa90: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
faa0: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
fab0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
fac0: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
fad0: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
fae0: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
faf0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
fb00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
fb10: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
fb20: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
fb30: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
fb40: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
fb50: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
fb60: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
fb70: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
fb80: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
fb90: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
fba0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
fbb0: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
fbc0: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
fbd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
fbe0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
fbf0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
fc00: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
fc10: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
fc20: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
fc30: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
fc40: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
fc50: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
fc60: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
fc70: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
fc80: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
fc90: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
fca0: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
fcb0: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
fcc0: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
fcd0: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
fce0: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
fcf0: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
fd00: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
fd10: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fd20: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
fd30: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
fd40: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
fd50: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
fd60: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
fd70: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
fd80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
fd90: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
fda0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
fdb0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
fdc0: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
fdd0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fde0: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
fdf0: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
fe00: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
fe10: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
fe20: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
fe30: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
fe40: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
fe50: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
fe60: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
fe70: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
fe80: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
fe90: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
fea0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
feb0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
fec0: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
fed0: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
fee0: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
fef0: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
ff00: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
ff10: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
ff20: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
ff30: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
ff40: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
ff50: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
ff60: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
ff70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
ff80: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
ff90: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
ffa0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
ffb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ffc0: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
ffd0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
ffe0: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
fff0: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
10000 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
10010 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
10020 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
10030 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10050 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
10060 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
10070 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
10080 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
100b0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
100c0 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
100d0 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
100e0 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
100f0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
10100 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
10120 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
10130 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
10140 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
10150 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
10160 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
10170 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
10180 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
10190 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
101a0 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
101b0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
101c0 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
101d0 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
101e0 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
101f0 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
10200 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
10210 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
10220 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
10230 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
10240 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10250 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
10260 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
10270 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
10280 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
10290 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
102a0 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
102b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
102c0 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
102d0 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
102e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
102f0 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
10300 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
10310 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
10320 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
10330 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
10340 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
10350 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
10360 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
10370 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
10380 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
10390 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
103a0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
103b0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
103c0 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
103d0 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
103e0 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
103f0 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
10400 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
10410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
10420 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
10430 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
10440 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
10450 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
10460 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
10470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10480 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
10490 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
104a0 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
104b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
104c0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
104d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
104e0 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
104f0 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
10500 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10510 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
10520 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
10530 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
10540 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
10550 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
10560 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
10570 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
10580 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
10590 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
105a0 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
105b0 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
105c0 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
105d0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
105e0 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
105f0 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
10600 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
10610 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
10620 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
10630 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
10640 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
10650 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
10660 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
10670 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
10680 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
10690 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
106a0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
106b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
106c0 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
106d0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
106e0 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
106f0 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
10700 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
10710 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10730 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
10740 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
10750 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
10760 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
10770 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
10780 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10790 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
107a0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
107b0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
107c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
107d0 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
107e0 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
107f0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10800 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10810 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10820 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
10830 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
10840 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10850 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
10860 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
10870 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
10880 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
10890 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
108a0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
108b0 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
108c0 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
108d0 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
108e0 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
108f0 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
10900 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
10910 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
10920 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
10930 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
10940 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
10950 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10960 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
10970 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
10980 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
10990 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
109a0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
109b0 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
109c0 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
109d0 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
109e0 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
109f0 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
10a00 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
10a10 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
10a20 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
10a30 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
10a40 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
10a50 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
10a60 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
10a70 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
10a80 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10a90 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
10aa0 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
10ab0 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
10ac0 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
10ad0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
10ae0 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
10af0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
10b00 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
10b10 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
10b20 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
10b30 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
10b40 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
10b50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10b60 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
10b70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
10b80 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
10b90 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
10ba0 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
10bb0 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10bc0 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10bd0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
10be0 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
10bf0 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
10c00 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
10c10 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
10c20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
10c30 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
10c40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10c50 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
10c60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10c70 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
10c80 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
10c90 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
10ca0 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10cb0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10cc0 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10cd0 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
10ce0 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
10cf0 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
10d00 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
10d10 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
10d20 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
10d30 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10d40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10d50 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
10d60 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
10d70 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
10d80 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
10d90 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
10da0 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
10db0 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10dc0 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10dd0 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10de0 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10df0 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10e00 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
10e10 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
10e20 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
10e30 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
10e40 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
10e50 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
10e60 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
10e70 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
10e80 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
10e90 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
10ea0 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
10eb0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10ec0 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10ed0 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10ee0 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10ef0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10f00 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
10f10 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
10f20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
10f30 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10f40 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10f50 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
10f60 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
10f70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10f80 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
10f90 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
10fa0 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
10fb0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10fc0 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10fd0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10fe0 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10ff0 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
11000 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
11010 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
11020 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
11030 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
11040 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
11050 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
11060 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
11070 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
11080 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
11090 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
110a0 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
110b0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
110c0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
110d0 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
110e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
110f0 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
11100 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
11110 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
11120 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
11130 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
11140 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
11150 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
11160 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
11170 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
11180 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
11190 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
111a0 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
111b0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
111c0 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
111d0 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
111e0 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
111f0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
11200 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
11210 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
11220 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
11230 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
11240 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
11250 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
11260 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
11270 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
11280 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
11290 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
112a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
112b0 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
112c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
112d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
112e0 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
11310 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
11320 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11340 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
11350 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
11360 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
11390 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
113a0 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
113b0 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
113c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
113d0 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
113e0 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
113f0 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
11420 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
11430 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11440 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
11450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
11460 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
11470 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
11480 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
11490 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
114a0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
114b0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
114c0 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
114d0 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20  ->jfd).  ){.    
114e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
114f0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
11500 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20  setMaster = 1;. 
11510 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11520 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
11530 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11540 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
11550 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
11560 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
11570 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
11580 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
11590 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
115a0 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
115b0 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
115c0 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
115d0 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
115e0 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
115f0 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
11600 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
11610 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
11620 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
11630 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
11640 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
11650 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
11660 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
11670 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
11680 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
11690 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
116a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
116b0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
116c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
116d0 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
116e0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
116f0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
11700 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
11710 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
11720 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
11730 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
11740 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
11750 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
11760 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
11770 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
11780 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
11790 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
117a0 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
117b0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
117c0 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
117d0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
117e0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
117f0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
11800 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
11810 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
11820 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
11830 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11840 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
11850 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
11860 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
11870 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
11880 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11890 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
118a0 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
118b0 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
118c0 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
118d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
118e0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
118f0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
11900 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d      iHdrOff+4+nM
11930 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
11940 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11950 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
11960 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
11970 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
11980 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11990 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
119a0 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
119b0 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
119c0 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
119d0 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
119e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
119f0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
11a00 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
11a10 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
11a20 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
11a30 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
11a40 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
11a50 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
11a60 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
11a70 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
11a80 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
11a90 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
11aa0 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11ab0 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
11ac0 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
11ad0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
11ae0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
11af0 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
11b00 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
11b10 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
11b20 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
11b30 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
11b40 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
11b50 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
11b60 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
11b70 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
11b80 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11b90 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
11ba0 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
11bb0 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
11bc0 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
11bd0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
11be0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
11bf0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
11c00 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
11c10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11c20 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
11c30 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11c40 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
11c50 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11c60 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
11c70 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
11c80 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69  er){.  pPager->i
11c90 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20  DataVersion++;. 
11ca0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
11cb0 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
11cc0 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65  ackup);.  sqlite
11cd0 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
11ce0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
11cf0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11d00 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  he pPager->iData
11d10 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f  Version value.*/
11d20 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61 67 65  .u32 sqlite3Page
11d30 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67  rDataVersion(Pag
11d40 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
11d50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
11d60 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
11d70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
11d80 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11d90 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  n;.}../*.** Free
11da0 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11db0 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11dc0 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11dd0 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
11de0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11df0 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
11e00 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
11e10 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11e20 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
11e30 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
11e40 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11e50 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
11e60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
11e70 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11e80 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11e90 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11eb0 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11ec0 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11ed0 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
11ee0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11ef0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11f00 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
11f10 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11f20 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
11f30 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
11f40 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
11f50 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
11f60 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
11f70 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
11f80 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ory(pPager->sjfd
11f90 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11fa0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11fb0 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11fc0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
11fd0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
11fe0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
11ff0 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
12000 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
12010 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
12020 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
12030 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
12040 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
12050 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
12060 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
12070 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
12080 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
12090 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
120a0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
120b0 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
120c0 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
120d0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
120e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
120f0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
12100 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
12110 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
12120 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
12130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
12140 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
12150 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12160 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
12170 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
12180 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
12190 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
121a0 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
121b0 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
121c0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
121d0 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
121e0 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
121f0 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
12200 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
12210 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
12220 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
12230 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
12240 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
12250 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
12260 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
12270 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
12280 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12290 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
122a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
122b0 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 49 66 20  URRENT./*.** If 
122c0 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61 6c 72  they are not alr
122d0 65 61 64 79 2c 20 62 65 67 69 6e 20 72 65 63 6f  eady, begin reco
122e0 72 64 69 6e 67 20 61 6c 6c 20 70 61 67 65 73 20  rding all pages 
122f0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
12300 67 65 72 20 6c 61 79 65 72 0a 2a 2a 20 62 79 20  ger layer.** by 
12310 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
12320 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
12330 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e   concurrent tran
12340 73 61 63 74 69 6f 6e 73 2e 20 52 65 74 75 72 6e  sactions. Return
12350 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  .** SQLITE_OK if
12360 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
12370 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
12380 63 6f 64 65 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  code (SQLITE_NOM
12390 45 4d 29 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  EM) if an error.
123a0 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
123b0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
123c0 67 69 6e 43 6f 6e 63 75 72 72 65 6e 74 28 50 61  ginConcurrent(Pa
123d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
123e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
123f0 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
12400 2d 3e 70 41 6c 6c 52 65 61 64 3d 3d 30 20 29 7b  ->pAllRead==0 ){
12410 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  .    pPager->pAl
12420 6c 52 65 61 64 20 3d 20 73 71 6c 69 74 65 33 42  lRead = sqlite3B
12430 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
12440 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20  er->dbSize);.   
12450 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
12460 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
12470 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Size;.    if( pP
12480 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 3d 3d  ager->pAllRead==
12490 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
124a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
124b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
124c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69   rc;.}../* !defi
124d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
124e0 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a  CONCURRENT).**.*
124f0 2a 20 53 74 6f 70 20 72 65 63 6f 72 64 69 6e 67  * Stop recording
12500 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20   all pages read 
12510 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
12520 61 79 65 72 20 62 79 20 74 68 65 20 62 2d 74 72  ayer by the b-tr
12530 65 65 20 6c 61 79 65 72 0a 2a 2a 20 61 6e 64 20  ee layer.** and 
12540 64 69 73 63 61 72 64 20 61 6e 79 20 63 75 72 72  discard any curr
12550 65 6e 74 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a  ent records..*/.
12560 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
12570 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 50  rEndConcurrent(P
12580 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
12590 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
125a0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41  stroy(pPager->pA
125b0 6c 6c 52 65 61 64 29 3b 0a 20 20 70 50 61 67 65  llRead);.  pPage
125c0 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d 20 30 3b  r->pAllRead = 0;
125d0 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28  .}../* !defined(
125e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
125f0 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 52 65  URRENT).**.** Re
12600 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
12610 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
12620 77 61 6c 20 6d 6f 64 65 2e 20 46 61 6c 73 65 20  wal mode. False 
12630 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
12640 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
12650 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
12660 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
12670 67 65 72 2d 3e 70 57 61 6c 21 3d 30 3b 0a 7d 0a  ger->pWal!=0;.}.
12680 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12690 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
126a0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20   */../*.** Free 
126b0 74 68 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  the Pager.pInJou
126c0 72 6e 61 6c 20 61 6e 64 20 50 61 67 65 72 2e 70  rnal and Pager.p
126d0 41 6c 6c 52 65 61 64 20 62 69 74 76 65 63 20 6f  AllRead bitvec o
126e0 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
126f0 63 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65  c void pagerFree
12700 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
12710 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
12720 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
12730 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
12740 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
12750 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
12760 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e 64 43  sqlite3PagerEndC
12770 6f 6e 63 75 72 72 65 6e 74 28 70 50 61 67 65 72  oncurrent(pPager
12780 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
12790 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
127a0 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
127b0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
127c0 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a  e mode and not.*
127d0 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  * in the ERROR s
127e0 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
127f0 20 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65   it switches the
12800 20 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f   pager to PAGER_
12810 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a  OPEN.** state..*
12820 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
12830 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
12840 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
12850 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
12860 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c  file is.** compl
12870 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  etely unlocked. 
12880 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
12890 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  nlocked and the 
128a0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73  file-system does
128b0 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20  .** not exhibit 
128c0 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f  the UNDELETABLE_
128d0 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72  WHEN_OPEN proper
128e0 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ty, the journal 
128f0 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  file is.** close
12900 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e  d (if it is open
12910 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
12920 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f  pager is in ERRO
12930 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  R state when thi
12940 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
12950 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f  lled, the .** co
12960 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12970 67 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69  ger cache are di
12980 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73  scarded before s
12990 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f  witching back to
129a0 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74   .** the OPEN st
129b0 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ate. Regardless 
129c0 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70  of whether the p
129d0 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
129e0 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20  sive-mode.** or 
129f0 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c  not, any journal
12a00 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68   file left in th
12a10 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69  e file-system wi
12a20 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a  ll be treated.**
12a30 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
12a40 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
12a50 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  k the next time 
12a60 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
12a70 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20  on.** is opened 
12a80 28 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61  (by this or by a
12a90 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ny other connect
12aa0 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ion)..*/.static 
12ab0 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
12ac0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
12ad0 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
12ae0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12af0 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20  ER_READER .     
12b00 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
12b10 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
12b20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
12b30 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12b40 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20  _ERROR .  );..  
12b50 70 61 67 65 72 46 72 65 65 42 69 74 76 65 63 73  pagerFreeBitvecs
12b60 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 6c 65  (pPager);.  rele
12b70 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
12b80 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
12b90 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
12ba0 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
12bb0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
12bc0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
12bd0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
12be0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
12bf0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
12c00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12c10 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12c20 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
12c30 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
12c40 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c60 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
12c70 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
12c80 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
12c90 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
12ca0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
12cb0 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
12cc0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
12cd0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
12ce0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
12cf0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
12d00 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
12d10 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
12d20 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
12d30 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
12d40 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
12d50 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
12d60 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
12d70 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
12d80 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
12d90 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
12da0 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
12db0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
12dc0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
12dd0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
12de0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12df0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
12e00 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12e10 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12e20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
12e30 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
12e40 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12e50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
12e60 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
12e70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12e80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12e90 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
12ea0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12eb0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12ec0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
12ed0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
12ee0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12ef0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
12f00 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
12f10 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
12f20 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
12f30 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
12f40 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
12f50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
12f60 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
12f70 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12f80 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
12f90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12fa0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
12fb0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
12fc0 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
12fd0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
12fe0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
12ff0 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
13000 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
13010 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
13020 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
13030 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
13040 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
13050 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
13060 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
13070 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
13080 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
13090 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
130a0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
130b0 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
130c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
130d0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
130e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
130f0 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
13100 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
13110 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
13120 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
13130 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
13140 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
13150 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
13160 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
13170 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
13180 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
13190 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
131a0 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
131b0 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
131c0 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
131d0 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
131e0 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
131f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
13200 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
13210 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
13220 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
13230 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
13240 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
13250 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
13260 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
13270 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
13280 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
13290 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
132a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
132b0 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
132c0 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
132d0 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
132e0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
132f0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
13300 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
13310 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
13320 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
13330 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
13340 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
13350 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
13360 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
13370 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
13380 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
13390 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
133a0 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
133b0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
133c0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
133d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
133e0 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
133f0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
13400 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
13410 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
13420 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Done = 0;.      
13430 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
13440 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
13450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
13460 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 28  ager->eState = (
13470 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13480 66 64 29 20 3f 20 50 41 47 45 52 5f 4f 50 45 4e  fd) ? PAGER_OPEN
13490 20 3a 20 50 41 47 45 52 5f 52 45 41 44 45 52 29   : PAGER_READER)
134a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
134b0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
134c0 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65   ) sqlite3OsUnfe
134d0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
134e0 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65  0, 0);.    pPage
134f0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
13500 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 73 65 74 47  ITE_OK;.    setG
13510 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67  etterMethod(pPag
13520 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  er);.  }..  pPag
13530 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
13540 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
13550 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
13560 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
13570 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
13580 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
13590 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
135a0 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c   an IOERR or FUL
135b0 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71  L error that req
135c0 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67  uires.** the pag
135d0 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  er to transition
135e0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
135f0 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f  state may ahve o
13600 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ccurred..** The 
13610 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
13620 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
13630 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
13640 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a  re, the second .
13650 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  ** the error-cod
13660 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
13670 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
13680 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
13690 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  The .** value re
136a0 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
136b0 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
136c0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
136d0 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
136e0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
136f0 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
13700 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
13710 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
13720 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d  he.** IOERR sub-
13730 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72  codes, the pager
13740 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f   enters the ERRO
13750 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
13760 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
13770 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
13780 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20  .errCode. While 
13790 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e  the pager remain
137a0 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
137b0 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a  tate,.** all maj
137c0 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  or API calls on 
137d0 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69  the Pager will i
137e0 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
137f0 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
13800 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52  .**.** The ERROR
13810 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73   state indicates
13820 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
13830 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
13840 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
13850 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
13860 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
13870 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
13880 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
13890 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
138a0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
138b0 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
138c0 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
138d0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
138e0 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
138f0 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
13900 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
13910 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
13920 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
13930 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
13940 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
13950 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
13960 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
13970 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
13980 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13990 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
139a0 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
139b0 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
139c0 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
139d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
139e0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
139f0 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
13a00 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
13a10 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
13a20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
13a30 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
13a40 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
13a50 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
13a60 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
13a70 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
13a80 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
13a90 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
13aa0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
13ab0 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
13ac0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
13ad0 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20   PAGER_ERROR;.  
13ae0 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
13af0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  d(pPager);.  }. 
13b00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
13b10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13b20 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
13b30 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
13b40 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ge);../*.** The 
13b50 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13b60 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61 67 65 72  n open on pPager
13b70 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
13b80 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29  ted (bCommit==1)
13b90 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  .** or rolled ba
13ba0 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e  ck (bCommit==0).
13bb0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  .**.** Return TR
13bc0 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  UE if and only i
13bd0 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  f all dirty page
13be0 73 20 73 68 6f 75 6c 64 20 62 65 20 66 6c 75 73  s should be flus
13bf0 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  hed to disk..**.
13c00 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ** Rules:.**.** 
13c10 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d    *  For non-TEM
13c20 50 20 64 61 74 61 62 61 73 65 73 2c 20 61 6c 77  P databases, alw
13c30 61 79 73 20 73 79 6e 63 20 74 6f 20 64 69 73 6b  ays sync to disk
13c40 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
13c50 73 61 72 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72  sary.**      for
13c60 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f   transactions to
13c70 20 62 65 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a   be durable..**.
13c80 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20 54 45 4d  **   *  Sync TEM
13c90 50 20 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20  P database only 
13ca0 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74  on a COMMIT (not
13cb0 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65   a ROLLBACK) whe
13cc0 6e 20 74 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a  n the backing.**
13cd0 20 20 20 20 20 20 66 69 6c 65 20 68 61 73 20 62        file has b
13ce0 65 65 6e 20 63 72 65 61 74 65 64 20 61 6c 72 65  een created alre
13cf0 61 64 79 20 28 76 69 61 20 61 20 73 70 69 6c 6c  ady (via a spill
13d00 20 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28   on pagerStress(
13d10 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77  )) and.**      w
13d20 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
13d30 66 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  f dirty pages in
13d40 20 6d 65 6d 6f 72 79 20 65 78 63 65 65 64 73 20   memory exceeds 
13d50 32 35 25 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  25% of the total
13d60 0a 2a 2a 20 20 20 20 20 20 63 61 63 68 65 20 73  .**      cache s
13d70 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
13d80 6e 74 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43  nt pagerFlushOnC
13d90 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
13da0 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  ger, int bCommit
13db0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
13dc0 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72  >tempFile==0 ) r
13dd0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21  eturn 1;.  if( !
13de0 62 43 6f 6d 6d 69 74 20 29 20 72 65 74 75 72 6e  bCommit ) return
13df0 20 30 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65   0;.  if( !isOpe
13e00 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  n(pPager->fd) ) 
13e10 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
13e20 72 6e 20 28 73 71 6c 69 74 65 33 50 43 61 63 68  rn (sqlite3PCach
13e30 65 50 65 72 63 65 6e 74 44 69 72 74 79 28 70 50  ePercentDirty(pP
13e40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d  ager->pPCache)>=
13e50 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  25);.}../*.** Th
13e60 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
13e70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  a transaction. A
13e80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13e90 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79  usually ended by
13ea0 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f   .** either a CO
13eb0 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
13ec0 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  CK operation. Th
13ed0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62  is routine may b
13ee0 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74  e called .** aft
13ef0 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61  er rollback of a
13f00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72   hot-journal, or
13f10 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
13f20 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
13f30 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g.** the journal
13f40 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67   file or writing
13f50 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
13f60 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f  journal-header o
13f70 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  f a.** database 
13f80 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
13f90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13fa0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
13fb0 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
13fc0 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20  state. If it is 
13fd0 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47  called.** in PAG
13fe0 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52  ER_NONE or PAGER
13ff0 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e  _SHARED state an
14000 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20  d the lock held 
14010 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75  is less.** exclu
14020 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45  sive than a RESE
14030 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73  RVED lock, it is
14040 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
14050 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61  Otherwise, any a
14060 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
14070 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a   are released..*
14080 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
14090 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
140a0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69  , then it is "fi
140b0 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61  nalized". Once a
140c0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
140d0 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  e has been final
140e0 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70  ized it is not p
140f0 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69  ossible to use i
14100 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61  t to roll back a
14110 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
14120 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65  . Nor will it be
14130 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
14140 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  e a hot-journal 
14150 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e  by this.** or an
14160 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  y other database
14170 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61   connection. Exa
14180 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e  ctly how a journ
14190 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a  al is finalized.
141a0 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  ** depends on wh
141b0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
141c0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
141d0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
141e0 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ode and.** the c
141f0 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d  urrent journal-m
14200 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e  ode (Pager.journ
14210 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61  alMode value), a
14220 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
14230 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
14240 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f  MEMORY.**     Jo
14250 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
14260 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20  iptor is simply 
14270 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73  closed. This des
14280 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20  troys an .**    
14290 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
142a0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  al..**.**   jour
142b0 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54  nalMode==TRUNCAT
142c0 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  E.**     Journal
142d0 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
142e0 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
142f0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
14300 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
14310 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68  ERSIST.**     Th
14320 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73  e first 28 bytes
14330 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
14340 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  file are zeroed.
14350 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65   This invalidate
14360 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72  s.**     the fir
14370 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
14380 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61  r in the file, a
14390 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74  nd hence the ent
143a0 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ire journal.**  
143b0 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61     file. An inva
143c0 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
143d0 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
143e0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
143f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c  journalMode==DEL
14400 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a  ETE.**     The j
14410 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
14420 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
14430 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  d using sqlite3O
14440 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
14450 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65       If the page
14460 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
14470 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
14480 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66  this method of f
14490 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20  inalizing.**    
144a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
144b0 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  e is never used.
144c0 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65   Instead, if the
144d0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a   journalMode is.
144e0 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e  **     DELETE an
144f0 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  d the pager is i
14500 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
14510 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73  , the method des
14520 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20  cribed under.** 
14530 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d      journalMode=
14540 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64  =PERSIST is used
14550 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
14560 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
14570 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20  l is finalized, 
14580 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  the pager moves 
14590 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
145a0 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e  state..** If run
145b0 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c  ning in non-excl
145c0 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  usive rollback m
145d0 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  ode, the lock on
145e0 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a   the file is .**
145f0 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
14600 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
14610 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
14620 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
14630 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66  error occurs. If
14640 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
14650 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f   during.** any o
14660 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69  f the IO operati
14670 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ons to finalize 
14680 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14690 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a   or unlock the.*
146a0 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20  * database then 
146b0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
146c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
146d0 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68   the user. If th
146e0 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  e .** operation 
146f0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
14700 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
14710 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64  ls, then the cod
14720 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73  e still.** tries
14730 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
14740 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
14750 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
14760 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a   mode. If the.**
14770 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
14780 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c  n fails as well,
14790 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
147a0 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74  error code relat
147b0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ed.** to the fir
147c0 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  st error encount
147d0 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61  ered (the journa
147e0 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
147f0 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ne) is.** return
14800 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14810 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
14820 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
14830 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61  Pager, int hasMa
14840 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  ster, int bCommi
14850 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
14860 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
14870 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
14880 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
14890 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
148a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
148b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
148c0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
148d0 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
148e0 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
148f0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
14900 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  f the pager does
14910 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65   not have an ope
14920 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
14930 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c  ion.  ** or at l
14940 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
14950 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74  lock. This funct
14960 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
14970 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a  d when there.  *
14980 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  * is no write-tr
14990 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
149a0 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20   but a RESERVED 
149b0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
149c0 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64  is.  ** held und
149d0 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  er two circumsta
149e0 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nces:.  **.  ** 
149f0 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63    1. After a suc
14a00 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72  cessful hot-jour
14a10 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  nal rollback, it
14a20 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a   is called with.
14a30 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65    **      eState
14a40 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64  ==PAGER_NONE and
14a50 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
14a60 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a  E_LOCK..  **.  *
14a70 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e  *   2. If a conn
14a80 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b  ection with lock
14a90 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
14aa0 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  ve holding an EX
14ab0 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20  CLUSIVE .  **   
14ac0 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73     lock switches
14ad0 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67   back to locking
14ae0 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64  _mode=normal and
14af0 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61   then executes a
14b00 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d  .  **      read-
14b10 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69  transaction, thi
14b20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
14b30 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65  lled with eState
14b40 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
14b50 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c    **      and eL
14b60 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
14b70 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61  OCK when the rea
14b80 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
14b90 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20   closed..  */.  
14ba0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
14bb0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
14bc0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
14bd0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
14be0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
14bf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
14c00 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
14c10 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65  _LOCKED && pPage
14c20 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45  r->eLock<RESERVE
14c30 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
14c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14c50 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c    }..  releaseAl
14c60 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
14c70 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  er);.  assert( i
14c80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
14c90 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
14ca0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a 20 20 20  nJournal==0 .   
14cb0 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
14cc0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
14cd0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
14ce0 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42  )&SQLITE_IOCAP_B
14cf0 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 29  ATCH_ATOMIC).  )
14d00 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ;.  if( isOpen(p
14d10 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
14d20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
14d30 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
14d40 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c  );..    /* Final
14d50 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
14d60 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
14d70 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49   sqlite3JournalI
14d80 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
14d90 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
14da0 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61 67 65  /* assert( pPage
14db0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
14dc0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14dd0 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20  E_MEMORY ); */. 
14de0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
14df0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
14e00 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14e10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14e20 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14e30 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
14e40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
14e50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
14e60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
14e70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14e80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14e90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14ea0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
14eb0 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
14ec0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14ed0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
14ee0 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
14ef0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
14f00 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  re the new file 
14f10 73 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20  size is written 
14f20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72  into the inode r
14f30 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20  ight away..     
14f40 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
14f50 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  e the journal mi
14f60 67 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f  ght resurrect fo
14f70 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20  llowing a power 
14f80 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20  loss and.       
14f90 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20     ** cause the 
14fa0 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  last transaction
14fb0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20   to roll back.  
14fc0 53 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  See.          **
14fd0 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
14fe0 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68  a.mozilla.org/sh
14ff0 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30  ow_bug.cgi?id=10
15000 37 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20  72773.          
15010 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
15020 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
15030 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
15040 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
15050 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15060 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
15070 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
15080 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
15090 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
150a0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
150b0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
150c0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
150d0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
150e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
150f0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
15100 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
15110 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
15120 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
15130 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 7c  ager, hasMaster|
15140 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
15150 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
15160 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
15170 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15180 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
15190 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65  h may be execute
151a0 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75  d with Pager.jou
151b0 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
151c0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68   if.      ** a h
151d0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a  ot-journal was j
151e0 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ust rolled back.
151f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
15200 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
15210 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  ** file should b
15220 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  e closed and del
15230 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f  eted. If this co
15240 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
15250 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
15260 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
15270 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69  t will do so usi
15280 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ng an in-memory 
15290 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a  journal..      *
152a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c  /.      int bDel
152b0 65 74 65 20 3d 20 21 70 50 61 67 65 72 2d 3e 74  ete = !pPager->t
152c0 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 61  empFile;.      a
152d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4a 6f  ssert( sqlite3Jo
152e0 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28  urnalIsInMemory(
152f0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20  pPager->jfd)==0 
15300 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15310 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15320 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
15330 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a  NALMODE_DELETE .
15340 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
15350 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
15360 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
15370 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
15380 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
15390 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
153a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
153b0 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
153c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
153d0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
153e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65  );.      if( bDe
153f0 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
15400 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
15410 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
15420 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
15430 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65 78 74  nal, pPager->ext
15440 72 61 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d  raSync);.      }
15450 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
15460 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
15470 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50  PAGES.  sqlite3P
15480 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
15490 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
154a0 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
154b0 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50  ehash);.  if( pP
154c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20  ager->dbSize==0 
154d0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
154e0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
154f0 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
15500 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71     PgHdr *p = sq
15510 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
15520 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
15530 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
15540 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b  p->pageHash = 0;
15550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
15560 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
15570 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  p);.    }.  }.#e
15580 6e 64 69 66 0a 0a 20 20 70 61 67 65 72 46 72 65  ndif..  pagerFre
15590 65 42 69 74 76 65 63 73 28 70 50 61 67 65 72 29  eBitvecs(pPager)
155a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
155b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d   = 0;.  if( rc==
155c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
155d0 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61   if( MEMDB || pa
155e0 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74  gerFlushOnCommit
155f0 28 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74  (pPager, bCommit
15600 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
15610 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
15620 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15630 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15640 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
15650 65 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70  eClearWritable(p
15660 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
15670 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15680 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
15690 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
156a0 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
156b0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  );.  }..  if( pa
156c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
156d0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70  ) ){.    /* Drop
156e0 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c   the WAL write-l
156f0 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73  ock, if any. Als
15700 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  o, if the connec
15710 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20  tion was in .   
15720 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   ** locking_mode
15730 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
15740 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
15750 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  , drop the EXCLU
15760 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  SIVE .    ** loc
15770 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  k held on the da
15780 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
15790 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71   */.    rc2 = sq
157a0 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65  lite3WalEndWrite
157b0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
157c0 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61  er->pWal);.    a
157d0 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49  ssert( rc2==SQLI
157e0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65  TE_OK );.  }else
157f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15800 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26  OK && bCommit &&
15810 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
15820 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  ize>pPager->dbSi
15830 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ze ){.    /* Thi
15840 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
15850 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  n when committin
15860 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
15870 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  in rollback-jour
15880 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20  nal.    ** mode 
15890 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
158a0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
158b0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
158c0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
158d0 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
158e0 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  oint the journal
158f0 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
15900 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e  zed and the tran
15910 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  saction .    ** 
15920 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
15930 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20  mitted, but the 
15940 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
15950 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
15960 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  the.    ** file.
15970 20 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   So it is safe t
15980 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  o truncate the d
15990 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
159a0 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  its minimum.    
159b0 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  ** required size
159c0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
159d0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
159e0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
159f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
15a00 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
15a10 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
15a20 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  e);.  }..  if( r
15a30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15a40 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65  bCommit && isOpe
15a50 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
15a60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15a70 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
15a80 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
15a90 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50  E_FCNTL_COMMIT_P
15aa0 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20  HASETWO, 0);.   
15ab0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15ac0 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
15ad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
15ae0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
15af0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
15b00 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61   && (!pagerUseWa
15b10 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c  l(pPager) || sql
15b20 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
15b30 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
15b40 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20  l, 0)).  ){.    
15b50 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63  rc2 = pagerUnloc
15b60 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
15b70 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
15b80 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
15b90 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  tDone = 0;.  }. 
15ba0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
15bb0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
15bc0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
15bd0 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  ter = 0;..  retu
15be0 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
15bf0 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
15c00 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
15c10 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
15c20 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
15c30 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
15c40 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
15c50 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
15c60 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
15c70 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
15c80 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20  ERROR state, do 
15c90 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
15ca0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
15cb0 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
15cc0 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
15cd0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
15ce0 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
15cf0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
15d00 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
15d10 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
15d20 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
15d30 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f  base file and mo
15d40 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63  ve the pager bac
15d50 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
15d60 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61   If this .** mea
15d70 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
15d80 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c   a hot-journal l
15d90 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
15da0 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74  system, the next
15db0 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
15dc0 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
15dd0 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  ed lock on the p
15de0 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20  ager (which may 
15df0 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a  be this one) .**
15e00 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61   will roll it ba
15e10 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
15e20 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
15e30 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
15e40 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
15e50 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
15e60 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
15e70 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
15e80 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
15e90 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
15ea0 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
15eb0 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
15ec0 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68  ROR state. Which
15ed0 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
15ee0 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
15ef0 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
15f00 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
15f10 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
15f20 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
15f30 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
15f40 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
15f50 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
15f60 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
15f70 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
15f80 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  !=PAGER_OPEN ){.
15f90 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
15fa0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
15fb0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66  Pager) );.    if
15fc0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15fd0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
15fe0 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73  OCKED ){.      s
15ff0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
16000 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
16010 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
16020 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
16030 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
16040 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
16050 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
16060 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
16070 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ode ){.      ass
16080 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
16090 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
160a0 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  R );.      pager
160b0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
160c0 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
160d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65      }.  }.  page
160e0 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
160f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
16100 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20  eter aData must 
16110 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
16120 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67  r of pPager->pag
16130 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f  eSize bytes.** o
16140 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20  f data. Compute 
16150 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
16160 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20  cksum based ont 
16170 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
16180 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20  the .** page of 
16190 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72  data and the cur
161a0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50  rent value of pP
161b0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e  ager->cksumInit.
161c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
161d0 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
161e0 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79  um. It is really
161f0 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
16200 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
16210 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70  initial value (p
16220 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
16230 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74  ) and every 200t
16240 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65  h byte.** of the
16250 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72   page data, star
16260 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f  ting with byte o
16270 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70  ffset (pPager->p
16280 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a  ageSize%200)..**
16290 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   Each byte is in
162a0 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
162b0 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  8-bit unsigned i
162c0 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68  nteger..**.** Ch
162d0 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75  anging the formu
162e0 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  la used to compu
162f0 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d  te this checksum
16300 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a   results in an.*
16310 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a  * incompatible j
16320 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
16330 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75  at..**.** If jou
16340 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
16350 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
16360 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
16370 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a  he most likely .
16380 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  ** scenario is t
16390 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
163a0 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
163b0 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
163c0 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69  hanged. .** It i
163d0 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  s much less like
163e0 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
163f0 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
16400 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
16410 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
16420 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
16430 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
16440 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
16450 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
16460 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
16470 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
16480 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
16490 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
164a0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
164b0 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
164c0 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
164d0 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
164e0 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
164f0 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  ->cksumInit;    
16500 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
16510 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
16520 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50   */.  int i = pP
16530 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
16540 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  00;          /* 
16550 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
16560 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
16570 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
16580 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
16590 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
165a0 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
165b0 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
165c0 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61  rent page size a
165d0 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  nd number of res
165e0 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b  erved bytes back
165f0 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63  .** to the codec
16600 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
16610 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61  TE_HAS_CODEC.sta
16620 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
16630 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a  portSize(Pager *
16640 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
16650 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
16660 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61  eChng ){.    pPa
16670 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
16680 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  hng(pPager->pCod
16690 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ec, pPager->page
166a0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166c0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52   (int)pPager->nR
166d0 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23  eserve);.  }.}.#
166e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
166f0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29  gerReportSize(X)
16700 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66       /* No-op if
16710 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
16720 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65  rt a codec */.#e
16730 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
16740 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
16750 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
16760 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
16770 72 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65  rved bits is the
16780 20 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73   same in the des
16790 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65  tination.** page
167a0 72 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68  r as it is in th
167b0 65 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20  e source.  This 
167c0 63 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20  comes up when a 
167d0 56 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74  VACUUM changes t
167e0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
167f0 72 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f  reserved bits to
16800 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61   the "optimal" a
16810 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mount..*/.void s
16820 71 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e  qlite3PagerAlign
16830 52 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70  Reserve(Pager *p
16840 44 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72  Dest, Pager *pSr
16850 63 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d  c){.  if( pDest-
16860 3e 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d  >nReserve!=pSrc-
16870 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20  >nReserve ){.   
16880 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
16890 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76   = pSrc->nReserv
168a0 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
168b0 72 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20  rtSize(pDest);. 
168c0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
168d0 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
168e0 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
168f0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
16900 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
16910 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
16920 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16930 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
16940 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
16950 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
16960 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
16970 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
16980 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
16990 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
169a0 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
169b0 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
169c0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
169d0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
169e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
169f0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
16a00 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73  l uses checksums
16a10 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74   - the statement
16a20 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a   journal does .*
16a30 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  * not..**.** If 
16a40 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
16a50 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  of the page reco
16a60 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
16a70 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
16a80 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
16a90 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
16aa0 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
16ab0 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70  r.dbSize, then p
16ac0 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b  layback is.** sk
16ad0 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45  ipped and SQLITE
16ae0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
16af0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20  .**.** If pDone 
16b00 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
16b10 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64  n it is a record
16b20 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
16b30 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  ave already.** b
16b40 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  een played back.
16b50 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74    If the page at
16b60 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c   *pOffset has al
16b70 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
16b80 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68  d back.** (if th
16b90 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
16ba0 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74  pDone bit is set
16bb0 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
16bc0 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b  playback..** Mak
16bd0 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65  e sure the pDone
16be0 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
16bf0 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73  ng to the *pOffs
16c00 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a  et page is set.*
16c10 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72  * prior to retur
16c20 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ning..**.** If t
16c30 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  he page record i
16c40 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
16c50 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
16c60 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
16c70 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61  ** and played ba
16c80 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ck, then SQLITE_
16c90 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
16ca0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
16cb0 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72  ccurs.** while r
16cc0 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72  eading the recor
16cd0 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16ce0 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  )journal file or
16cf0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a   while writing.*
16d00 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
16d10 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
16d20 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
16d30 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64  s returned. If d
16d40 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  ata.** is succes
16d50 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
16d60 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
16d70 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65  al file but appe
16d80 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72  ars to be.** cor
16d90 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
16da0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
16db0 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65   Data is conside
16dc0 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e  red corrupted in
16dd0 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74  .** two circumst
16de0 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ances:.** .**   
16df0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
16e00 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69  page-number is i
16e10 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47  llegal (0 or PAG
16e20 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a  ER_MJ_PGNO), or.
16e30 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
16e40 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f  cord is being ro
16e50 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  lled back from t
16e60 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
16e70 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20  file.**     and 
16e80 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65  the checksum fie
16e90 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ld does not matc
16ea0 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  h the record con
16eb0 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74  tent..**.** Neit
16ec0 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f  her of these two
16ed0 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70   scenarios are p
16ee0 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61  ossible during a
16ef0 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
16f00 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
16f10 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  is is a savepoin
16f20 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  t rollback, then
16f30 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65   memory may have
16f40 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
16f50 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
16f60 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
16f70 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
16f80 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c   case and an all
16f90 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
16fa0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
16fb0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
16fc0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
16fd0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
16fe0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
16ff0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
17000 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
17010 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
17020 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66  k */.  i64 *pOff
17030 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
17040 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
17050 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79  f record to play
17060 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
17070 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20   *pDone,        
17080 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
17090 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
170a0 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
170b0 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72  /.  int isMainJr
170c0 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nl,             
170d0 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a    /* 1 -> main j
170e0 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62  ournal. 0 -> sub
170f0 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69  -journal. */.  i
17100 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20  nt isSavepnt    
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17120 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70  True for a savep
17130 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  oint rollback */
17140 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
17150 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17170 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
17180 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
17190 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
171c0 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
171d0 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
171e0 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17200 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
17210 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
17220 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61  g */.  char *aDa
17230 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
17240 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
17250 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
17260 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
17270 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
17280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17290 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
172a0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
172b0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
172c0 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  sSynced;        
172d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
172e0 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65   if journal page
172f0 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69   is synced */.#i
17300 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
17310 43 4f 44 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a  CODEC.  /* The j
17320 72 6e 6c 45 6e 63 20 66 6c 61 67 20 69 73 20 74  rnlEnc flag is t
17330 72 75 65 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70  rue if Journal p
17340 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70  ages should be p
17350 61 73 73 65 64 20 74 68 72 6f 75 67 68 0a 20 20  assed through.  
17360 2a 2a 20 74 68 65 20 63 6f 64 65 63 2e 20 20 49  ** the codec.  I
17370 74 20 69 73 20 66 61 6c 73 65 20 66 6f 72 20 70  t is false for p
17380 75 72 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  ure in-memory jo
17390 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e  urnals. */.  con
173a0 73 74 20 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d  st int jrnlEnc =
173b0 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20   (isMainJrnl || 
173c0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
173d0 6d 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66  mory==0);.#endif
173e0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
173f0 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
17400 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
17410 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
17420 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
17430 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
17440 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
17450 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
17460 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
17470 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
17480 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
17490 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
174a0 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
174b0 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
174c0 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
174d0 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
174e0 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
174f0 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
17500 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
17510 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
17520 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
17530 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
17540 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
17550 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
17560 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
17570 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
17580 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
17590 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
175a0 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
175b0 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65  Either the state
175c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
175d0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
175e0 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61  CHEMOD (a transa
175f0 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73  ction .  ** or s
17600 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
17610 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65  k done at the re
17620 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c  quest of the cal
17630 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a  ler) or this is.
17640 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
17650 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20  al rollback. If 
17660 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  it is a hot-jour
17670 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  nal rollback, th
17680 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20  e pager.  ** is 
17690 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e  in state OPEN an
176a0 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55  d holds an EXCLU
176b0 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a  SIVE lock. Hot-j
176c0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
176d0 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20    ** only reads 
176e0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
176f0 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73  urnal, not the s
17700 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ub-journal..  */
17710 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17720 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
17730 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
17740 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
17750 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
17760 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
17770 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
17780 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20  VE_LOCK).  );.  
17790 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
177a0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
177b0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c  ITER_CACHEMOD ||
177c0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a   isMainJrnl );..
177d0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
177e0 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
177f0 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
17800 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
17810 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
17820 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
17830 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
17840 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
17850 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
17860 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
17870 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
17880 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
17890 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
178a0 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
178b0 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
178c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
178d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
178e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
178f0 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
17900 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17910 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
17920 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
17930 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17940 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
17950 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
17960 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
17970 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
17980 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
17990 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
179a0 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
179b0 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
179c0 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
179d0 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
179e0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
179f0 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
17a00 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
17a10 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
17a20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
17a30 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
17a40 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
17a50 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
17a60 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
17a70 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
17a80 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
17a90 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
17aa0 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
17ab0 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
17ac0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
17ad0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
17ae0 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
17af0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17b00 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
17b10 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
17b20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
17b30 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
17b40 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
17b50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17b60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17b70 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
17b80 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
17b90 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
17ba0 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
17bb0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
17bc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
17bd0 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17be0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
17bf0 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
17c00 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
17c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
17c20 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
17c30 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
17c40 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
17c50 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65  n played back be
17c60 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20  fore during the 
17c70 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  current.  ** rol
17c80 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27  lback, then don'
17c90 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79  t bother to play
17ca0 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a   it back again..
17cb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65    */.  if( pDone
17cc0 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
17cd0 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
17ce0 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
17cf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17d00 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
17d10 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
17d20 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72  k page 1, restor
17d30 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  e the nReserve s
17d40 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66  etting.  */.  if
17d50 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ( pgno==1 && pPa
17d60 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28  ger->nReserve!=(
17d70 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20  (u8*)aData)[20] 
17d80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
17d90 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29  Reserve = ((u8*)
17da0 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20  aData)[20];.    
17db0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
17dc0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
17dd0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
17de0 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73  is in CACHEMOD s
17df0 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
17e00 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
17e10 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
17e20 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
17e30 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
17e40 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
17e50 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
17e60 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
17e70 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
17e80 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
17e90 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
17ea0 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
17eb0 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
17ec0 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
17ed0 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
17ee0 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
17ef0 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
17f00 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
17f10 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
17f20 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
17f30 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
17f40 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
17f50 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
17f60 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
17f70 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
17f80 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
17f90 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
17fa0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
17fb0 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
17fc0 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
17fd0 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
17fe0 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
17ff0 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
18000 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
18010 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
18020 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
18030 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c  in WRITER_DBMOD,
18040 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
18050 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
18060 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
18070 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61  he.  ** pager ca
18080 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
18090 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
180a0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
180b0 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a  then marked .  *
180c0 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e  * not dirty. Sin
180d0 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  ce this code is 
180e0 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e  only executed in
180f0 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
18100 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74  e for.  ** a hot
18110 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
18120 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  k, it is guarant
18130 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  eed that the pag
18140 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79  e-cache is empty
18150 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67  .  ** if the pag
18160 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74  er is in OPEN st
18170 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ate..  **.  ** T
18180 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
18190 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
181a0 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
181b0 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
181c0 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
181d0 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
181e0 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
181f0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
18200 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
18210 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
18220 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
18230 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
18240 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
18250 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
18260 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
18270 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
18280 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
18290 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
182a0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
182b0 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
182c0 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
182d0 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
182e0 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
182f0 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
18300 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
18310 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
18320 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
18330 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
18340 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
18350 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
18360 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
18370 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
18380 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
18390 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
183a0 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
183b0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
183c0 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
183d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
183e0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
183f0 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
18400 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
18410 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
18420 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
18430 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
18440 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
18450 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
18460 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
18470 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
18480 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
18490 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
184a0 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
184b0 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
184c0 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
184d0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
184e0 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
184f0 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
18500 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
18510 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
18520 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
18530 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
18540 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
18550 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
18560 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
18570 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
18580 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
18590 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
185a0 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
185b0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
185c0 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
185d0 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
185e0 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
185f0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
18600 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
18610 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
18620 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  se{.    pPg = sq
18630 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
18640 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
18650 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
18660 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
18670 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18680 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
18690 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c  PEN || pPg==0 ||
186a0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
186b0 65 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  e );.  PAGERTRAC
186c0 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
186d0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
186e0 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
186f0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
18700 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
18710 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
18720 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
18730 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
18740 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
18750 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
18760 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
18770 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
18780 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
18790 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
187a0 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
187b0 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
187c0 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
187d0 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
187e0 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
187f0 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
18800 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
18810 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
18820 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
18830 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
18840 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
18850 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
18860 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
18870 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
18880 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
18890 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
188a0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
188b0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
188c0 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
188d0 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
188e0 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
188f0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
18900 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18910 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
18920 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
18930 20 57 72 69 74 65 20 74 68 65 20 64 61 74 61 20   Write the data 
18940 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
18950 75 72 6e 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20  urnal back into 
18960 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18970 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  e..    ** This i
18980 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 20 65  s usually safe e
18990 76 65 6e 20 66 6f 72 20 61 6e 20 65 6e 63 72 79  ven for an encry
189a0 70 74 65 64 20 64 61 74 61 62 61 73 65 20 2d 20  pted database - 
189b0 61 73 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  as the data.    
189c0 2a 2a 20 77 61 73 20 65 6e 63 72 79 70 74 65 64  ** was encrypted
189d0 20 62 65 66 6f 72 65 20 69 74 20 77 61 73 20 77   before it was w
189e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
189f0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
18a00 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a  exception.    **
18a10 20 69 73 20 69 66 20 74 68 65 20 64 61 74 61 20   is if the data 
18a20 77 61 73 20 6a 75 73 74 20 72 65 61 64 20 66 72  was just read fr
18a30 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  om an in-memory 
18a40 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  sub-journal. In 
18a50 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 73 65  that.    ** case
18a60 20 69 74 20 6d 75 73 74 20 62 65 20 65 6e 63 72   it must be encr
18a70 79 70 74 65 64 20 68 65 72 65 20 62 65 66 6f 72  ypted here befor
18a80 65 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  e it is copied i
18a90 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
18aa0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a  .    ** file.  *
18ab0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
18ac0 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66  HAS_CODEC.    if
18ad0 28 20 21 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20  ( !jrnlEnc ){.  
18ae0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
18af0 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
18b00 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
18b10 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61 29 3b  EM_BKPT, aData);
18b20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18b30 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
18b40 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61  r->fd, (u8 *)aDa
18b50 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
18b60 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
18b70 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
18b80 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  , aData, pgno, 3
18b90 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18ba0 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c  M_BKPT);.    }el
18bb0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63  se.#endif.    rc
18bc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
18bd0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
18be0 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  8 *)aData, pPage
18bf0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
18c00 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 67 6e  t);..    if( pgn
18c10 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
18c20 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
18c30 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
18c40 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
18c50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
18c60 42 61 63 6b 75 70 20 29 7b 0a 23 69 66 64 65 66  Backup ){.#ifdef
18c70 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
18c80 43 0a 20 20 20 20 20 20 69 66 28 20 6a 72 6e 6c  C.      if( jrnl
18c90 45 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 43  Enc ){.        C
18ca0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
18cb0 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
18cc0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
18cd0 50 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  PT);.        sql
18ce0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
18cf0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
18d00 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
18d10 74 61 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  ta);.        COD
18d20 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
18d30 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
18d40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
18d50 2c 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  ,aData);.      }
18d60 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
18d70 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
18d80 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
18d90 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
18da0 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  *)aData);.    }.
18db0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
18dc0 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
18dd0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
18de0 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
18df0 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
18e00 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
18e10 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
18e20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
18e30 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
18e40 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
18e50 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
18e60 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
18e70 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
18e80 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
18e90 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
18ea0 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
18eb0 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
18ec0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
18ed0 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
18ee0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
18ef0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
18f00 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
18f10 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
18f20 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
18f30 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
18f40 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
18f50 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
18f60 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
18f70 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
18f80 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
18f90 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
18fa0 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
18fb0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
18fc0 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
18fd0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
18fe0 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
18ff0 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
19000 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
19010 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
19020 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
19030 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
19040 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
19050 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
19060 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
19070 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
19080 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
19090 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
190a0 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
190b0 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
190c0 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
190d0 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
190e0 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
190f0 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
19100 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
19110 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
19120 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
19130 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
19140 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
19150 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73  vepnt );.    ass
19160 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f  ert( (pPager->do
19170 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
19180 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d  FLAG_ROLLBACK)==
19190 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
191a0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
191b0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
191c0 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  K;.    rc = sqli
191d0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
191e0 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
191f0 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
19200 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
19210 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
19220 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a  ROLLBACK)!=0 );.
19230 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
19240 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
19250 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
19260 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19270 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
19280 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
19290 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
192a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
192b0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
192c0 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
192d0 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
192e0 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
192f0 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
19300 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
19310 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
19320 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
19330 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
19340 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
19350 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
19360 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
19370 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
19380 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
19390 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
193a0 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
193b0 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
193c0 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
193d0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
193e0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
193f0 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
19400 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
19410 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
19420 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
19430 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
19440 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
19450 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
19460 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
19470 20 2f 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62   /* It used to b
19480 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 63  e that sqlite3Pc
19490 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
194a0 67 29 20 77 61 73 20 63 61 6c 6c 65 64 20 68 65  g) was called he
194b0 72 65 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  re.  But.    ** 
194c0 74 68 61 74 20 63 61 6c 6c 20 77 61 73 20 64 61  that call was da
194d0 6e 67 65 72 6f 75 73 20 61 6e 64 20 68 61 64 20  ngerous and had 
194e0 6e 6f 20 64 65 74 65 63 74 61 62 6c 65 20 62 65  no detectable be
194f0 6e 65 66 69 74 20 73 69 6e 63 65 20 74 68 65 20  nefit since the 
19500 63 61 63 68 65 0a 20 20 20 20 2a 2a 20 69 73 20  cache.    ** is 
19510 6e 6f 72 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64  normally cleaned
19520 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
19530 65 43 6c 65 61 6e 41 6c 6c 28 29 20 61 66 74 65  eCleanAll() afte
19540 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  r rollback and s
19550 6f 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  o.    ** has bee
19560 6e 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20  n removed. */.  
19570 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
19580 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20  hash(pPg);..    
19590 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
195a0 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
195b0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
195c0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
195d0 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
195e0 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
195f0 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
19600 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
19610 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
19620 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
19630 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
19640 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
19650 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
19660 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
19670 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
19680 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
19690 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  */.#if SQLITE_HA
196a0 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20  S_CODEC.    if( 
196b0 6a 72 6e 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43  jrnlEnc ){ CODEC
196c0 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
196d0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
196e0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
196f0 4b 50 54 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20  KPT); }.#endif. 
19700 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
19710 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
19720 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19730 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
19740 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
19750 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
19760 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
19770 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
19780 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
19790 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
197a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
197b0 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
197c0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
197d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
197e0 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
197f0 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
19800 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19810 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
19820 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
19830 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
19840 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
19850 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
19860 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
19870 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
19880 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
19890 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
198a0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
198b0 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
198c0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
198d0 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
198e0 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
198f0 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
19900 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
19910 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
19920 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
19930 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
19940 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
19950 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
19960 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
19970 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
19980 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
19990 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
199a0 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
199b0 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
199c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
199d0 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
199e0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
199f0 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
19a00 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
19a10 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
19a20 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
19a30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
19a40 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
19a50 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
19a60 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
19a70 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
19a80 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
19a90 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
19aa0 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
19ab0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
19ac0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
19ad0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
19ae0 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
19af0 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
19b00 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
19b10 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
19b20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
19b30 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
19b40 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
19b50 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
19b60 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
19b70 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
19b80 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
19b90 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
19ba0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
19bb0 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
19bc0 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
19bd0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
19be0 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
19bf0 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
19c00 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
19c10 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
19c20 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
19c30 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
19c40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
19c50 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
19c60 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
19c70 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
19c80 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
19c90 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
19ca0 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
19cb0 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
19cc0 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
19cd0 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
19ce0 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
19cf0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
19d00 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
19d10 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
19d20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
19d30 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
19d40 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
19d50 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
19d60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
19d70 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
19d80 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
19d90 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
19da0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
19db0 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
19dc0 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
19dd0 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
19de0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
19df0 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
19e00 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
19e10 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
19e20 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
19e30 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
19e40 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
19e50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19e60 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
19e70 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
19e80 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
19e90 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
19ea0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
19eb0 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
19ec0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19ed0 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
19ee0 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
19ef0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
19f00 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
19f10 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
19f20 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f40 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
19f50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
19f60 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
19f70 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
19f80 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
19f90 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
19fa0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
19fb0 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
19fc0 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
19fd0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
19fe0 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
19ff0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
1a000 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
1a010 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a020 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
1a030 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
1a040 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
1a050 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a060 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
1a070 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
1a080 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1a090 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
1a0a0 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
1a0b0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
1a0c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
1a0d0 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
1a0e0 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
1a0f0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1a100 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
1a110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
1a120 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
1a130 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
1a140 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
1a150 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1a160 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
1a170 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
1a180 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a190 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
1a1a0 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
1a1b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1a1c0 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
1a1d0 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
1a1e0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
1a1f0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1a200 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
1a210 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
1a220 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
1a230 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
1a240 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
1a250 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
1a260 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
1a270 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a280 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  M_BKPT;.  }else{
1a290 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
1a2a0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
1a2b0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
1a2c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
1a2d0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
1a2e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1a2f0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1a300 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
1a310 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1a320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1a330 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a340 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
1a350 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
1a360 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
1a370 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
1a380 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
1a390 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
1a3a0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
1a3b0 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
1a3c0 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
1a3d0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
1a3e0 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
1a3f0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
1a400 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
1a410 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
1a420 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
1a430 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
1a440 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
1a450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1a460 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
1a470 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
1a480 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1a490 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
1a4a0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
1a4b0 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
1a4c0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
1a4d0 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
1a4e0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1a4f0 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  (nMasterJournal 
1a500 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31  + nMasterPtr + 1
1a510 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  );.  if( !zMaste
1a520 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
1a530 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a540 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  M_BKPT;.    goto
1a550 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a560 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
1a570 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
1a580 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
1a590 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
1a5a0 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
1a5b0 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
1a5c0 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
1a5d0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
1a5e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a5f0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
1a600 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
1a610 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
1a620 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
1a630 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
1a640 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
1a650 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
1a660 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
1a670 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
1a680 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
1a690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a6a0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1a6b0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
1a6c0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1a6d0 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
1a6e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a6f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
1a700 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
1a710 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
1a720 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
1a730 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
1a740 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
1a750 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1a760 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
1a770 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
1a780 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
1a790 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
1a7a0 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
1a7b0 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
1a7c0 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
1a7d0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1a7e0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
1a7f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
1a800 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
1a810 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
1a820 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
1a830 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1a840 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1a850 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
1a860 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
1a870 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
1a880 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1a890 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a8a0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1a8b0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
1a8c0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
1a8d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
1a8e0 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
1a8f0 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
1a900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
1a910 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
1a920 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1a930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a940 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1a950 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
1a960 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
1a970 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
1a980 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
1a990 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
1a9a0 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
1a9b0 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
1a9c0 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
1a9d0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1a9e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
1a9f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
1aa00 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1aa10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1aa20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
1aa30 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1aa40 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
1aa50 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
1aa60 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
1aa70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
1aa80 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
1aa90 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
1aaa0 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
1aab0 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
1aac0 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
1aad0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
1aae0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
1aaf0 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
1ab00 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
1ab10 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
1ab20 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
1ab30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ab40 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
1ab50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1ab60 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
1ab70 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
1ab80 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
1ab90 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
1aba0 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
1abb0 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
1abc0 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
1abd0 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
1abe0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1abf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
1ac00 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
1ac10 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
1ac20 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
1ac30 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1ac40 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
1ac50 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73   or the pager is
1ac60 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a   not in either.*
1ac70 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20  * DBMOD or OPEN 
1ac80 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
1ac90 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1aca0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
1acb0 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20  size .** of the 
1acc0 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20  file is changed 
1acd0 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
1ace0 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
1acf0 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a  geSize bytes). .
1ad00 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1ad10 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
1ad20 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
1ad30 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
1ad40 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
1ad50 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
1ad60 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
1ad70 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
1ad80 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1ad90 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
1ada0 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
1adb0 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
1adc0 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
1add0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1ade0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
1adf0 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
1ae00 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
1ae10 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
1ae20 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
1ae30 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
1ae40 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
1ae50 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
1ae60 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
1ae70 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
1ae80 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
1ae90 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1aea0 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
1aeb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1aec0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
1aed0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
1aee0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
1aef0 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
1af00 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1af10 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
1af20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
1af30 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
1af40 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
1af50 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
1af60 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
1af70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1af80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1af90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1afa0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
1afb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1afc0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
1afd0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20  R_READER );.  . 
1afe0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1aff0 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28  er->fd) .   && (
1b000 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1b010 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1b020 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1b030 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1b040 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ) .  ){.    i64 
1b050 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
1b060 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Size;.    int sz
1b070 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
1b080 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73  ageSize;.    ass
1b090 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1b0a0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
1b0b0 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44  CK );.    /* TOD
1b0c0 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f  O: Is it safe to
1b0d0 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c   use Pager.dbFil
1b0e0 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20  eSize here? */. 
1b0f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b100 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1b110 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
1b120 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
1b130 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e   = szPage*(i64)n
1b140 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63  Page;.    if( rc
1b150 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
1b160 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53  urrentSize!=newS
1b170 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ize ){.      if(
1b180 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77   currentSize>new
1b190 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1b1a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
1b1b0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
1b1c0 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
1b1d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75     }else if( (cu
1b1e0 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65  rrentSize+szPage
1b1f0 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  )<=newSize ){.  
1b200 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70        char *pTmp
1b210 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1b220 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65  pace;.        me
1b230 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a  mset(pTmp, 0, sz
1b240 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74  Page);.        t
1b250 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a  estcase( (newSiz
1b260 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72  e-szPage) == cur
1b270 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  rentSize );.    
1b280 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
1b290 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e  ewSize-szPage) >
1b2a0 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b    currentSize );
1b2b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1b2c0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1b2d0 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73  ger->fd, pTmp, s
1b2e0 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73  zPage, newSize-s
1b2f0 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zPage);.      }.
1b300 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b320 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1b330 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1b340 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b350 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b360 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1b370 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f  sanitized versio
1b380 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d  n of the sector-
1b390 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20  size of OS file 
1b3a0 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65  pFile. The.** re
1b3b0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75  turn value is gu
1b3c0 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20  aranteed to lie 
1b3d0 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d  between 32 and M
1b3e0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
1b3f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
1b400 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1b410 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
1b420 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69   int iRet = sqli
1b430 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
1b440 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52  pFile);.  if( iR
1b450 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65  et<32 ){.    iRe
1b460 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  t = 512;.  }else
1b470 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45   if( iRet>MAX_SE
1b480 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
1b490 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
1b4a0 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
1b4b0 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f  .    iRet = MAX_
1b4c0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
1b4d0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a  .  return iRet;.
1b4e0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1b4f0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
1b500 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1b510 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
1b520 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
1b530 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
1b540 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
1b550 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
1b560 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
1b570 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1b580 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
1b590 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
1b5a0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
1b5b0 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c   the size and al
1b5c0 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e  ignment of journ
1b5d0 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a  al header and .*
1b5e0 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1b5f0 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e   pointers within
1b600 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c   created journal
1b610 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   files..**.** Fo
1b620 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1b630 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
1b640 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
1b650 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e  lways 512 bytes.
1b660 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1b670 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72  , for non-tempor
1b680 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65  ary files, the e
1b690 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1b6a0 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76  size is.** the v
1b6b0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1b6c0 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1b6d0 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65  () method rounde
1b6e0 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a  d up to 32 if.**
1b6f0 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1b700 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20   32, or rounded 
1b710 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
1b720 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
1b730 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1b740 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1b750 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
1b760 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49  ile has the SQLI
1b770 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1b780 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f  FE_OVERWRITE pro
1b790 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a  perty, then set.
1b7a0 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ** the effective
1b7b0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20   sector size to 
1b7c0 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  its minimum valu
1b7d0 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75  e (512).  The pu
1b7e0 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67  rpose of.** pPag
1b7f0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69  er->sectorSize i
1b800 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20  s to define the 
1b810 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f  "blast radius" o
1b820 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20  f bytes that.** 
1b830 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20  might change if 
1b840 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77  a crash occurs w
1b850 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
1b860 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1b870 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20  .** that range. 
1b880 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53   But with POWERS
1b890 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74  AFE_OVERWRITE, t
1b8a0 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20  he blast radius 
1b8b0 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74  is zero.** (that
1b8c0 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41   is what POWERSA
1b8d0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61  FE_OVERWRITE mea
1b8e0 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d  ns), so we minim
1b8f0 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a  ize the sector.*
1b900 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63  * size.  For bac
1b910 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
1b920 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c  lity of the roll
1b930 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
1b940 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20  e format,.** we 
1b950 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68  cannot reduce th
1b960 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1b970 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31  or size below 51
1b980 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
1b990 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
1b9a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1b9b0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1b9c0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1b9d0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1b9e0 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
1b9f0 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c  r->tempFile.   |
1ba00 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
1ba10 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1ba20 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20  s(pPager->fd) & 
1ba30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1ba40 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1ba50 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
1ba60 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1ba70 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73  Sector size does
1ba80 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74  n't matter for t
1ba90 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
1baa0 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20  Also, the file. 
1bab0 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61     ** may not ha
1bac0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79  ve been opened y
1bad0 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  et, in which cas
1bae0 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69  e the OsSectorSi
1baf0 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ze().    ** call
1bb00 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20   will segfault. 
1bb10 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
1bb20 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
1bb30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
1bb40 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1bb50 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72   = sqlite3Sector
1bb60 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
1bb70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
1bb80 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
1bb90 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
1bba0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
1bbb0 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
1bbc0 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1bbd0 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
1bbe0 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
1bbf0 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
1bc00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1bc10 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
1bc20 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
1bc30 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
1bc40 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
1bc50 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
1bc60 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1bc70 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1bc80 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1bc90 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
1bca0 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
1bcb0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1bcc0 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
1bcd0 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1bce0 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
1bcf0 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
1bd00 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
1bd10 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1bd20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
1bd30 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1bd40 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1bd50 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
1bd60 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
1bd70 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
1bd80 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
1bd90 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
1bda0 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1bdb0 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
1bdc0 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
1bdd0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
1bde0 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
1bdf0 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
1be00 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1be10 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1be20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
1be30 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
1be40 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
1be50 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
1be60 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
1be70 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1be80 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1be90 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
1bea0 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
1beb0 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
1bec0 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
1bed0 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
1bee0 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
1bef0 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
1bf00 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
1bf10 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
1bf20 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
1bf30 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
1bf40 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
1bf50 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
1bf60 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
1bf70 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
1bf80 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
1bf90 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
1bfa0 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
1bfb0 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
1bfc0 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
1bfd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
1bfe0 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1bff0 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
1c000 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
1c010 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
1c020 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
1c030 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
1c040 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
1c050 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
1c060 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
1c070 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
1c080 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1c090 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
1c0a0 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
1c0b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1c0c0 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
1c0d0 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
1c0e0 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
1c0f0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1c100 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
1c110 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
1c120 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
1c130 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1c140 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
1c150 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
1c160 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
1c170 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
1c180 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
1c190 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
1c1a0 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
1c1b0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1c1c0 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
1c1d0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1c1e0 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
1c1f0 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
1c200 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
1c210 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
1c220 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
1c230 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
1c240 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1c250 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
1c260 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
1c270 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1c280 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
1c290 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
1c2a0 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
1c2b0 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
1c2c0 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
1c2d0 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
1c2e0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
1c2f0 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
1c300 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
1c310 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
1c320 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
1c330 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
1c340 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
1c350 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
1c360 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
1c370 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
1c380 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
1c390 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
1c3a0 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
1c3b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1c3c0 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
1c3d0 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
1c3e0 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
1c3f0 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
1c400 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
1c410 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
1c420 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
1c430 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
1c440 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
1c450 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
1c460 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
1c470 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
1c480 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1c490 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
1c4a0 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
1c4b0 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
1c4c0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
1c4d0 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
1c4e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1c4f0 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
1c500 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
1c510 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
1c520 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1c530 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
1c540 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1c550 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
1c560 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
1c570 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
1c580 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
1c590 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
1c5a0 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
1c5b0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1c5c0 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
1c5d0 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
1c5e0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
1c5f0 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
1c600 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
1c610 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
1c620 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
1c630 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
1c640 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
1c650 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
1c660 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
1c670 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
1c680 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
1c690 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
1c6a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1c6b0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
1c6c0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1c6d0 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
1c6e0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1c6f0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
1c700 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
1c710 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1c720 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1c730 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1c740 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
1c750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c760 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
1c770 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1c780 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
1c790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1c7a0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1c7b0 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
1c7c0 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
1c7d0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1c7e0 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
1c7f0 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
1c800 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1c810 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1c820 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
1c830 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1c840 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
1c850 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
1c860 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1c870 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
1c880 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
1c890 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
1c8a0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
1c8b0 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
1c8c0 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
1c8d0 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
1c8e0 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
1c8f0 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
1c900 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
1c910 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61  */.  int nPlayba
1c920 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ck = 0;       /*
1c930 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1c940 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20   pages restored 
1c950 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
1c960 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1c970 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
1c980 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
1c990 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
1c9a0 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
1c9b0 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
1c9c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c9d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1c9e0 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  fd) );.  rc = sq
1c9f0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1ca00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
1ca10 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
1ca20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
1ca30 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1ca40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
1ca50 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1ca60 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
1ca70 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
1ca80 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
1ca90 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1caa0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1cab0 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
1cac0 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
1cad0 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
1cae0 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
1caf0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
1cb00 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
1cb10 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
1cb20 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
1cb30 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65  **.  ** TODO: Te
1cb40 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f  chnically the fo
1cb50 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72  llowing is an er
1cb60 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61  ror because it a
1cb70 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a  ssumes that.  **
1cb80 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54   buffer Pager.pT
1cb90 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61  mpSpace is (mxPa
1cba0 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20  thname+1) bytes 
1cbb0 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20  or larger. i.e. 
1cbc0 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65  that.  ** (pPage
1cbd0 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70  r->pageSize >= p
1cbe0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1cbf0 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e  athname+1). Usin
1cc00 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a  g os_unix.c,.  *
1cc10 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20  * mxPathname is 
1cc20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
1cc30 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
1cc40 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
1cc50 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
1cc60 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
1cc70 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1cc80 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
1cc90 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1cca0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1ccb0 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1ccc0 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1ccd0 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
1cce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ccf0 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
1cd00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1cd10 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
1cd20 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
1cd30 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
1cd40 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
1cd50 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
1cd60 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
1cd70 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
1cd80 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1cd90 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1cda0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
1cdb0 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
1cdc0 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
1cdd0 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
1cde0 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
1cdf0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
1ce00 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
1ce10 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
1ce20 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
1ce30 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
1ce40 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
1ce50 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
1ce60 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f  hile( 1 ){.    /
1ce70 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
1ce80 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
1ce90 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1cea0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
1ceb0 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
1cec0 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
1ced0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1cee0 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
1cef0 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
1cf00 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
1cf10 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
1cf20 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20  ocess must have 
1cf30 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
1cf40 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
1cf50 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
1cf60 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
1cf70 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1cf80 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
1cf90 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
1cfa0 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f  Hdr(pPager, isHo
1cfb0 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  t, szJ, &nRec, &
1cfc0 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
1cfd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
1cfe0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1cff0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1d000 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d010 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1d020 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1d030 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
1d040 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1d050 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
1d060 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
1d070 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
1d080 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
1d090 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
1d0a0 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
1d0b0 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
1d0c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
1d0d0 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
1d0e0 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
1d0f0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1d100 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
1d110 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
1d120 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1d130 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
1d140 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
1d150 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1d160 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
1d170 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1d180 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1d190 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1d1a0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
1d1b0 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
1d1c0 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
1d1d0 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
1d1e0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1d1f0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1d200 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
1d210 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
1d220 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
1d230 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
1d240 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
1d250 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
1d260 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
1d270 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
1d280 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
1d290 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
1d2a0 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
1d2b0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
1d2c0 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
1d2d0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
1d2e0 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
1d2f0 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
1d300 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1d310 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
1d320 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
1d330 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1d340 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1d350 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
1d360 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
1d370 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
1d380 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a  et #2565..    **
1d390 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
1d3a0 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ck a hot journal
1d3b0 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73  , nRec==0 always
1d3c0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1d3d0 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e  next.    ** chun
1d3e0 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
1d3f0 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70   contains zero p
1d400 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  ages to be rolle
1d410 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20  d back.  But.   
1d420 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61   ** when doing a
1d430 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68   ROLLBACK and th
1d440 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20  e nRec==0 chunk 
1d450 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e  is the last chun
1d460 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  k in.    ** the 
1d470 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e  journal, it mean
1d480 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1d490 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
1d4a0 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20   additional.    
1d4b0 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  ** pages that ne
1d4c0 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
1d4d0 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1d4e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1d4f0 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  s .    ** should
1d500 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73   be computed bas
1d510 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
1d520 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20  l file size..   
1d530 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
1d540 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
1d550 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1d560 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
1d570 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1d580 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
1d590 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
1d5a0 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1d5b0 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
1d5c0 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
1d5d0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1d5e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1d5f0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1d600 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
1d610 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1d620 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
1d630 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1d640 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
1d650 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
1d660 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1d670 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1d680 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1d690 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
1d6a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
1d6b0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
1d6c0 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
1d6d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d6e0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1d6f0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1d700 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1d710 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
1d720 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1d730 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
1d740 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
1d750 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
1d760 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
1d770 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1d780 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
1d790 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1d7a0 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
1d7b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
1d7c0 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
1d7d0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
1d7e0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1d7f0 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
1d800 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
1d810 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1d820 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
1d830 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65  ge(pPager,&pPage
1d840 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
1d850 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,0);.      if( 
1d860 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d870 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61  .        nPlayba
1d880 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ck++;.      }els
1d890 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e{.        if( r
1d8a0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1d8b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
1d8c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1d8d0 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
1d8e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1d8f0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1d900 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1d910 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1d920 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
1d930 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75  nal has been tru
1d940 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73  ncated, simply s
1d950 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a  top reading and.
1d960 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1d970 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72  cessing the jour
1d980 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20  nal. This might 
1d990 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f  happen if the jo
1d9a0 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20  urnal was.      
1d9b0 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c      ** not compl
1d9c0 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e  etely written an
1d9d0 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  d synced prior t
1d9e0 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74  o a crash.  In t
1d9f0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1da00 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62   case, the datab
1da10 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ase should have 
1da20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
1da30 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  en in the.      
1da40 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61      ** first pla
1da50 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74  ce so it is OK t
1da60 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e  o simply abandon
1da70 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a   the rollback. *
1da80 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
1da90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1daa0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1dab0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
1dac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dad0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
1dae0 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
1daf0 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75  k, quit and retu
1db00 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  rn the error.   
1db10 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20         ** code. 
1db20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
1db30 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
1db40 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
1db50 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ate.          **
1db60 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74   so that no furt
1db70 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65  her harm will be
1db80 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20   done.  Perhaps 
1db90 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20  the next.       
1dba0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f     ** process to
1dbb0 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c   come along will
1dbc0 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
1dbd0 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
1dbe0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1dbf0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1dc00 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1dc10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1dc20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
1dc30 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
1dc40 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
1dc50 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c  ayback:.  /* Fol
1dc60 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1dc70 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1dc80 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1dc90 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1dca0 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1dcb0 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1dcc0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1dcd0 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1dce0 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1dcf0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1dd00 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1dd10 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1dd20 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1dd30 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1dd40 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1dd50 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1dd60 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1dd70 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1dd80 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1dd90 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ods ){.    sqlit
1dda0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
1ddb0 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  int(pPager->fd,S
1ddc0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1ddd0 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d  NCHANGED,0);.  }
1dde0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1ddf0 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69   this playback i
1de00 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f  s happening auto
1de10 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72  matically as a r
1de20 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f  esult of an IO o
1de30 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65  r .  ** malloc e
1de40 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72  rror that occurr
1de50 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ed after the cha
1de60 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20  nge-counter was 
1de70 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a  updated but .  *
1de80 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  * before the tra
1de90 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
1dea0 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65  mitted, then the
1deb0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1dec0 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
1ded0 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65  on may just have
1dee0 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20   been reverted. 
1def0 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  If this happens 
1df00 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20  in exclusive .  
1df10 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75  ** mode, then su
1df20 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63  bsequent transac
1df30 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
1df40 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  by the connectio
1df50 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  n will not.  ** 
1df60 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
1df70 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c  e-counter at all
1df80 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20  . This may lead 
1df90 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69  to cache inconsi
1dfa0 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62  stency.  ** prob
1dfb0 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70  lems for other p
1dfc0 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65  rocesses at some
1dfd0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
1dfe0 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20  ture. So, just. 
1dff0 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73   ** in case this
1e000 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63   has happened, c
1e010 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43  lear the changeC
1e020 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f  ountDone flag no
1e030 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  w..  */.  pPager
1e040 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1e050 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
1e060 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d  File;..  if( rc=
1e070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e080 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1e090 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1e0a0 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
1e0b0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1e0c0 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
1e0d0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1e0e0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
1e0f0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1e100 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1e110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e120 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65  _OK.   && (pPage
1e130 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1e140 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
1e150 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1e160 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29  =PAGER_OPEN).  )
1e170 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1e180 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67  e3PagerSync(pPag
1e190 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  er, 0);.  }.  if
1e1a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e1b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1e1c0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1e1d0 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
1e1e0 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a  r[0]!='\0', 0);.
1e1f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1e200 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1e210 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1e220 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1e230 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
1e240 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
1e250 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
1e260 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
1e270 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1e280 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
1e290 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
1e2a0 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
1e2b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1e2c0 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
1e2d0 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
1e2e0 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
1e2f0 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
1e300 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1e310 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1e320 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61  isHot && nPlayba
1e330 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
1e340 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
1e350 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
1e360 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64  BACK, "recovered
1e370 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25   %d pages from %
1e380 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1e390 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70      nPlayback, p
1e3a0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
1e3b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1e3c0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1e3d0 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1e3e0 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1e3f0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1e400 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1e410 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1e420 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1e430 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1e440 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1e450 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1e460 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1e470 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1e480 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1e490 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1e4a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1e4b0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1e4c0 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1e4d0 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1e4e0 74 61 62 61 73 65 20 66 69 6c 65 20 28 6f 72 20  tabase file (or 
1e4f0 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 57 41  out of.** the WA
1e500 4c 20 69 66 20 74 68 61 74 20 69 73 20 77 68 65  L if that is whe
1e510 72 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  re the most rece
1e520 6e 74 20 63 6f 70 79 20 69 66 20 66 6f 75 6e 64  nt copy if found
1e530 29 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  ) into .** pPg->
1e540 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1e550 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1e560 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1e570 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1e580 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1e590 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1e5a0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1e5b0 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1e5c0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1e5d0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1e5e0 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1e5f0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1e600 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e610 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1e620 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1e630 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1e640 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1e650 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1e660 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1e670 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1e680 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1e690 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1e6a0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1e6b0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1e6c0 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1e6d0 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1e6e0 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1e6f0 70 50 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  pPg */.  int rc 
1e700 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1e710 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e720 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 69 46  code */.  u32 iF
1e730 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rame = 0;       
1e740 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20         /* Frame 
1e750 6f 66 20 57 41 4c 20 63 6f 6e 74 61 69 6e 69 6e  of WAL containin
1e760 67 20 70 67 6e 6f 20 2a 2f 0a 0a 20 20 61 73 73  g pgno */..  ass
1e770 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1e780 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
1e790 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  R && !MEMDB );. 
1e7a0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1e7b0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
1e7c0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
1e7d0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
1e7e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1e7f0 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
1e800 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ->pWal, pPg->pgn
1e810 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
1e820 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1e830 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   rc;.  }.  if( i
1e840 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 72 63 20  Frame ){.    rc 
1e850 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1e860 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1e870 61 6c 2c 20 69 46 72 61 6d 65 2c 70 50 61 67 65  al, iFrame,pPage
1e880 72 2d 3e 70 61 67 65 53 69 7a 65 2c 70 50 67 2d  r->pageSize,pPg-
1e890 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65  >pData);.  }else
1e8a0 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1e8b0 74 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  t = (pPg->pgno-1
1e8c0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1e8d0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
1e8e0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1e8f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
1e900 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  >pData, pPager->
1e910 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65  pageSize, iOffse
1e920 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
1e930 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1e940 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1e950 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e960 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1e970 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  ( pPg->pgno==1 )
1e980 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
1e990 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1e9a0 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
1e9b0 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
1e9c0 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
1e9d0 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
1e9e0 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
1e9f0 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
1ea00 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
1ea10 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
1ea20 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
1ea30 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
1ea40 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
1ea50 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
1ea60 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
1ea70 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
1ea80 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1ea90 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
1eaa0 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
1eab0 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
1eac0 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
1ead0 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
1eae0 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
1eaf0 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
1eb00 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
1eb10 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
1eb20 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
1eb30 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
1eb40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1eb50 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
1eb60 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
1eb70 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
1eb80 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
1eb90 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
1eba0 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1ebb0 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
1ebc0 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
1ebd0 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
1ebe0 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65    ** white noise
1ebf0 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74   equaling 16 byt
1ec00 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61  es of 0xff is va
1ec10 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
1ec20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73  so.      ** we s
1ec30 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f  hould still be o
1ec40 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
1ec50 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
1ec60 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66  >dbFileVers, 0xf
1ec70 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  f, sizeof(pPager
1ec80 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1ec90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eca0 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
1ecb0 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
1ecc0 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20  ata)[24];.      
1ecd0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1ece0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1ecf0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
1ed00 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1ed10 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s));.    }.  }. 
1ed20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
1ed30 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d  pPg->pData, pPg-
1ed40 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53  >pgno, 3, rc = S
1ed50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1ed60 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
1ed70 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1ed80 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1ed90 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1eda0 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1edb0 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1edc0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1edd0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  g->pgno));.  PAG
1ede0 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1edf0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1ee00 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1ee10 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1ee20 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1ee30 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1ee40 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
1ee50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ee60 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61  ** Update the va
1ee70 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  lue of the chang
1ee80 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66  e-counter at off
1ee90 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69  sets 24 and 92 i
1eea0 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  n.** the header 
1eeb0 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76  and the sqlite v
1eec0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74  ersion number at
1eed0 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a   offset 96..**.*
1eee0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63  * This is an unc
1eef0 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74  onditional updat
1ef00 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65  e.  See also the
1ef10 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1ef20 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72  gecounter().** r
1ef30 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c  outine which onl
1ef40 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1ef50 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20  ange-counter if 
1ef60 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63  the update is ac
1ef70 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64  tually.** needed
1ef80 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20  , as determined 
1ef90 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63  by the pPager->c
1efa0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73  hangeCountDone s
1efb0 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a  tate variable..*
1efc0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
1efd0 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1efe0 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70  counter(PgHdr *p
1eff0 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67  Pg){.  u32 chang
1f000 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a  e_counter;..  /*
1f010 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1f020 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1f030 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1f040 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1f050 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1f060 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
1f070 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61  te((u8*)pPg->pPa
1f080 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1f090 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  +1;.  put32bits(
1f0a0 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1f0b0 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
1f0c0 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41  ounter);..  /* A
1f0d0 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51  lso store the SQ
1f0e0 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
1f0f0 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e  ber in bytes 96.
1f100 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20  .99 and in.  ** 
1f110 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f  bytes 92..95 sto
1f120 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  re the change co
1f130 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20  unter for which 
1f140 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
1f150 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64  er.  ** is valid
1f160 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
1f170 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1f180 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
1f190 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33  counter);.  put3
1f1a0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1f1b0 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51  g->pData)+96, SQ
1f1c0 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
1f1d0 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  BER);.}..#ifndef
1f1e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1f1f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f200 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
1f210 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
1f220 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ge that has alre
1f230 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69  ady been .** wri
1f240 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f  tten into the lo
1f250 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41  g file when a WA
1f260 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1f270 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
1f280 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69   Parameter iPg i
1f290 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1f2a0 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20  r of said page. 
1f2b0 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e  The pCtx argumen
1f2c0 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c  t .** is actuall
1f2d0 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
1f2e0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1f2f0 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  re..**.** If pag
1f300 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74  e iPg is present
1f310 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61   in the cache, a
1f320 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  nd has no outsta
1f330 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1f340 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61  ,.** it is disca
1f350 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rded. Otherwise,
1f360 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
1f370 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61  e or more outsta
1f380 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e  nding.** referen
1f390 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f  ces, the page co
1f3a0 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65  ntent is reloade
1f3b0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1f3c0 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61  ase. If the.** a
1f3d0 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64  ttempt to reload
1f3e0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1f3f0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
1f400 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73  quired and fails
1f410 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  , .** return an 
1f420 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1f430 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
1f440 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
1f450 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f  ic int pagerUndo
1f460 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
1f470 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a  Ctx, Pgno iPg){.
1f480 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f490 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1f4a0 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
1f4b0 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a  )pCtx;.  PgHdr *
1f4c0 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
1f4d0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1f4e0 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73  er) );.  pPg = s
1f4f0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1f500 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a  p(pPager, iPg);.
1f510 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
1f520 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63   if( sqlite3Pcac
1f530 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  hePageRefcount(p
1f540 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Pg)==1 ){.      
1f550 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
1f560 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  p(pPg);.    }els
1f570 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  e{.      rc = re
1f580 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
1f590 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f5a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f5b0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1f5c0 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1f5d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1f5e0 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
1f5f0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1f600 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1f610 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1f620 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1f630 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1f640 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1f650 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1f660 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1f670 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1f680 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1f690 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1f6a0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1f6b0 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1f6c0 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1f6d0 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1f6e0 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1f6f0 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1f700 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1f710 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1f720 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1f730 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1f740 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1f750 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1f760 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1f770 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1f780 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1f790 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1f7a0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1f7b0 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1f7c0 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1f7d0 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1f7e0 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1f7f0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1f800 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1f810 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1f820 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f830 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1f840 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1f850 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1f860 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f870 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1f880 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f890 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1f8c0 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1f8d0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1f8e0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1f8f0 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1f900 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1f910 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1f920 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1f930 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1f940 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1f950 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1f960 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1f970 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1f980 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1f990 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1f9a0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1f9b0 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1f9c0 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1f9d0 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1f9e0 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1f9f0 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1fa00 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1fa10 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1fa20 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1fa30 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1fa40 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1fa50 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1fa60 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1fa70 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1fa80 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1fa90 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1faa0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1fab0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1fac0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69  r->pPCache);..#i
1fad0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fae0 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2f  T_CONCURRENT.  /
1faf0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1fb00 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
1fb10 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 70 61 67  action, then pag
1fb20 65 20 31 20 6d 75 73 74 20 62 65 20 72 65 72 65  e 1 must be rere
1fb30 61 64 20 66 72 6f 6d 20 0a 20 20 2a 2a 20 74 68  ad from .  ** th
1fb40 65 20 64 62 20 66 69 6c 65 2c 20 65 76 65 6e 20  e db file, even 
1fb50 69 66 20 69 74 20 69 73 20 6e 6f 74 20 64 69 72  if it is not dir
1fb60 74 79 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ty. This is beca
1fb70 75 73 65 20 74 68 65 20 62 2d 74 72 65 65 20 6c  use the b-tree l
1fb80 61 79 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 68  ayer .  ** may h
1fb90 61 76 65 20 61 6c 72 65 61 64 79 20 7a 65 72 6f  ave already zero
1fba0 65 64 20 74 68 65 20 6e 46 72 65 65 20 61 6e 64  ed the nFree and
1fbb0 20 69 54 72 75 6e 6b 20 68 65 61 64 65 72 20 66   iTrunk header f
1fbc0 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28  ields.  */.  if(
1fbd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1fbe0 26 20 28 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  & (pList==0 || p
1fbf0 4c 69 73 74 2d 3e 70 67 6e 6f 21 3d 31 29 20 26  List->pgno!=1) &
1fc00 26 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65  & pPager->pAllRe
1fc10 61 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ad ){.    rc = p
1fc20 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1fc30 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20  ((void*)pPager, 
1fc40 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  1);.  }.#endif..
1fc50 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1fc60 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1fc70 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1fc80 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1fc90 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1fca0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1fcb0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1fcc0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1fcd0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1fce0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1fcf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1fd00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1fd10 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1fd20 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1fd30 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1fd40 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1fd50 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1fd60 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1fd70 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1fd80 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1fd90 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1fda0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1fdb0 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1fdc0 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1fdd0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1fde0 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1fdf0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1fe00 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1fe10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1fe20 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1fe30 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1fe40 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1fe50 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1fe60 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1fe70 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1fe80 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1fe90 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1fea0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1feb0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1fec0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1fed0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1fee0 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff00 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1ff10 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1ff20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1ff30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1ff40 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1ff50 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1ff60 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff80 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1ff90 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1ffa0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffc0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ffd0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1ffe0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1fff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20000 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
20010 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
20020 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
20030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
20040 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
20050 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
20060 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
20070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
20080 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
20090 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
200a0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
200b0 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
200c0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
200d0 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
200e0 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
200f0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
20100 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
20110 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
20120 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
20130 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
20140 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
20150 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
20160 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
20170 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
20180 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
20190 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
201a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
201b0 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
201c0 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
201d0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
201e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
201f0 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
20200 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
20210 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
20220 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
20230 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
20240 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
20250 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
20260 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
20270 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
20280 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
20290 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
202a0 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
202b0 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
202c0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
202d0 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
202e0 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
202f0 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
20300 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
20310 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  List++;.        
20320 50 41 47 45 52 54 52 41 43 45 28 28 22 54 4f 2d  PAGERTRACE(("TO-
20330 57 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 68  WAL %d page %d h
20340 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20360 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
20370 72 29 2c 20 70 2d 3e 70 67 6e 6f 2c 20 70 61 67  r), p->pgno, pag
20380 65 72 5f 70 61 67 65 68 61 73 68 28 70 29 29 29  er_pagehash(p)))
20390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
203a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
203b0 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
203c0 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d    nList = 1;.  }
203d0 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74  .  pPager->aStat
203e0 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
203f0 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20  E] += nList;..  
20400 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
20410 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
20420 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
20430 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71  List);.  rc = sq
20440 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70  lite3WalFrames(p
20450 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
20460 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
20470 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72  Size, pList, nTr
20480 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74  uncate, isCommit
20490 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  , pPager->walSyn
204a0 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66  cFlags.  );.  if
204b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
204c0 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  && pPager->pBack
204d0 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d  up ){.    for(p=
204e0 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
204f0 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71  Dirty){.      sq
20500 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
20510 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
20520 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20  p, p->pgno, (u8 
20530 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  *)p->pData);.   
20540 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
20550 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
20560 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  S.  pList = sqli
20570 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
20580 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
20590 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  he);.  for(p=pLi
205a0 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
205b0 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73  ty){.    pager_s
205c0 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a  et_pagehash(p);.
205d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
205e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
205f0 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74  * Begin a read t
20600 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
20610 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  e WAL..**.** Thi
20620 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  s routine used t
20630 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67  o be called "pag
20640 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29  erOpenSnapshot()
20650 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73  " because it ess
20660 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  entially.** make
20670 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20  s a snapshot of 
20680 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
20690 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e  the current poin
206a0 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72  t in time and pr
206b0 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20  eserves.** that 
206c0 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65  snapshot for use
206d0 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69   by the reader i
206e0 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75  n spite of concu
206f0 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20  rrently changes 
20700 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74  by.** other writ
20710 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e  ers or checkpoin
20720 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
20730 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65  int pagerBeginRe
20740 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  adTransaction(Pa
20750 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20760 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
20770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20780 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
20790 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20  /.  int changed 
207a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
207b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
207c0 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73  ache must be res
207d0 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
207e0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
207f0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
20800 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20810 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  ==PAGER_OPEN || 
20820 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
20830 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
20840 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c  .  /* sqlite3Wal
20850 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
20860 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  on() was not cal
20870 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76  led for the prev
20880 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ious.  ** transa
20890 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67  ction in locking
208a0 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e  _mode=EXCLUSIVE.
208b0 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77    So call it now
208c0 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72  .  If we.  ** ar
208d0 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e in locking_mod
208e0 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64  e=NORMAL and End
208f0 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69  Read() was previ
20900 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20  ously called,.  
20910 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  ** the duplicate
20920 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73   call is harmles
20930 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
20940 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
20950 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
20960 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Wal);..  rc = sq
20970 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61  lite3WalBeginRea
20980 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
20990 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e  ger->pWal, &chan
209a0 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ged);.  if( rc!=
209b0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61  SQLITE_OK || cha
209c0 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65  nged ){.    page
209d0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
209e0 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
209f0 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
20a00 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
20a10 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
20a20 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
20a30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
20a40 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20a50 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
20a60 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  t of the transit
20a70 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f  ion from PAGER_O
20a80 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f  PEN.** to PAGER_
20a90 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20  READER state to 
20aa0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
20ab0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
20ac0 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61  se file.** in pa
20ad0 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  ges (assuming th
20ae0 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72  e page size curr
20af0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
20b00 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e  Pager.pageSize).
20b10 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
20b20 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
20b30 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
20b40 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
20b50 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
20b60 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f   in pages is sto
20b70 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20  red in *pnPage. 
20b80 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
20b90 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70  ror code (perhap
20ba0 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52  s.** SQLITE_IOER
20bb0 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75  R_FSTAT) is retu
20bc0 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65  rned and *pnPage
20bd0 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
20be0 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
20bf0 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  nt pagerPagecoun
20c00 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
20c10 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a   Pgno *pnPage){.
20c20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
20c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c40 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
20c50 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
20c60 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20   */..  /* Query 
20c70 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
20c80 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  em for the datab
20c90 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61  ase size. The Wa
20ca0 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66  lDbsize().  ** f
20cb0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
20cc0 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20  zero if the WAL 
20cd0 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65  is not open (i.e
20ce0 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29  . Pager.pWal==0)
20cf0 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65  , or.  ** if the
20d00 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
20d10 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
20d20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
20d30 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ze is not.  ** a
20d40 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
20d50 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
20d60 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   if the log file
20d70 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a   is empty or.  *
20d80 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61  * contains no va
20d90 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72  lid committed tr
20da0 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f  ansactions..  */
20db0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20dc0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
20dd0 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
20de0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
20df0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
20e00 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
20e10 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
20e20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20e30 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
20e40 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69  ;.  nPage = sqli
20e50 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61  te3WalDbsize(pPa
20e60 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f  ger->pWal);..  /
20e70 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
20e80 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
20e90 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20ea0 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
20eb0 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d  he.  ** WAL sub-
20ec0 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e  system, determin
20ed0 65 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  e the page count
20ee0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
20ef0 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64  ze of.  ** the d
20f00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
20f10 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
20f20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20f30 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69  is not an.  ** i
20f40 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
20f50 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  of the page-size
20f60 2c 20 72 6f 75 6e 64 20 75 70 20 74 68 65 20 72  , round up the r
20f70 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
20f80 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 41 4c  ( nPage==0 && AL
20f90 57 41 59 53 28 69 73 4f 70 65 6e 28 70 50 61 67  WAYS(isOpen(pPag
20fa0 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
20fb0 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fd0 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65   Size of db file
20fe0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
20ff0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
21000 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
21010 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20  er->fd, &n);.   
21020 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21030 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
21040 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
21050 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28   nPage = (Pgno)(
21060 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (n+pPager->pageS
21070 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d  ize-1) / pPager-
21080 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
21090 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
210a0 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
210b0 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
210c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
210d0 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67   the.  ** config
210e0 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
210f0 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
21100 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
21110 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
21120 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
21130 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
21140 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
21150 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
21160 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
21170 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
21180 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  }..  *pnPage = n
21190 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
211a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
211b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
211c0 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  _WAL./*.** Check
211d0 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
211e0 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  le that correspo
211f0 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nds to the datab
21200 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50  ase opened by pP
21210 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69  ager.** exists i
21220 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
21230 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76  s not empy, or v
21240 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a  erify that the *
21250 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  -wal file does.*
21260 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20  * not exist (by 
21270 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20  deleting it) if 
21280 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21290 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  e is empty..**.*
212a0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
212b0 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61  e is not empty a
212c0 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  nd the *-wal fil
212d0 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74  e exists, open t
212e0 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57  he pager.** in W
212f0 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65  AL mode.  If the
21300 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
21310 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61  ty or if no *-wa
21320 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
21330 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72  d.** if no error
21340 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75   occurs, make su
21350 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  re Pager.journal
21360 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20  Mode is not set 
21370 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  to.** PAGER_JOUR
21380 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a  NALMODE_WAL..**.
21390 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
213a0 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  _OK or an error 
213b0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
213c0 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64  caller must hold
213d0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
213e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
213f0 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ile to call this
21400 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65  .** function. Be
21410 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49  cause an EXCLUSI
21420 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
21430 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  b file is requir
21440 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a  ed to delete .**
21450 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65   a WAL on a none
21460 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c  -empty database,
21470 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
21480 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63  ere is no race c
21490 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74  ondition .** bet
214a0 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73  ween the xAccess
214b0 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20  () below and an 
214c0 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20  xDelete() being 
214d0 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65  executed by some
214e0 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65   .** other conne
214f0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
21500 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61   int pagerOpenWa
21510 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72  lIfPresent(Pager
21520 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
21530 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21540 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21550 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
21560 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
21570 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
21580 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
21590 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
215a0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
215b0 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20   int isWal;     
215c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
215d0 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69  * True if WAL fi
215e0 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
215f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
21600 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 70  ccess(.        p
21610 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
21620 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54  ger->zWal, SQLIT
21630 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
21640 20 26 69 73 57 61 6c 0a 20 20 20 20 29 3b 0a 20   &isWal.    );. 
21650 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
21670 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20  ( isWal ){.     
21680 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
216b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
216c0 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ..        rc = p
216d0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
216e0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
216f0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
21700 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
21710 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
21720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21730 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
21740 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
21750 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
21760 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21770 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
21780 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63  ase( sqlite3Pcac
21790 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
217a0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
217b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
217c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
217d0 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
217e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
217f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
21800 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
21810 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
21820 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
21830 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21840 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
21850 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
21860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21870 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21880 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
21890 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
218a0 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
218b0 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
218c0 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
218d0 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
218e0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
218f0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
21900 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
21910 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
21920 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
21930 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
21940 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
21950 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
21960 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
21970 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
21980 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
21990 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
219a0 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
219b0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
219c0 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
219d0 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
219e0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
219f0 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
21a00 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
21a10 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
21a20 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
21a30 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
21a40 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
21a50 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
21a60 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
21a70 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
21a80 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
21a90 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
21aa0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
21ab0 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
21ac0 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
21ad0 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
21ae0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
21af0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
21b00 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
21b10 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
21b20 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
21b30 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
21b40 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
21b50 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
21b60 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
21b70 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
21b80 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
21b90 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
21ba0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
21bb0 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
21bc0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
21bd0 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
21be0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
21bf0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
21c00 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
21c10 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
21c20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
21c30 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
21c40 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
21c50 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
21c60 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
21c70 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
21c80 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
21c90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
21ca0 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
21cb0 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
21cc0 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
21cd0 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
21ce0 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
21cf0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
21d00 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
21d10 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
21d20 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
21d30 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
21d40 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
21d50 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
21d60 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
21d70 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
21d80 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
21d90 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
21da0 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
21db0 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
21dc0 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
21dd0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
21de0 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
21df0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
21e00 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
21e10 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
21e20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
21e30 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
21e40 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
21e50 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
21e60 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
21e70 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
21e80 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
21e90 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
21ea0 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
21eb0 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
21ec0 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
21ed0 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
21ee0 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
21ef0 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
21f00 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
21f10 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
21f20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
21f30 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
21f40 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
21f50 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
21f60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
21f70 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
21f80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
21f90 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
21fa0 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
21fb0 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
21fc0 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
21fd0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
21fe0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
21ff0 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
22000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
22010 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
22020 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
22030 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
22040 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22050 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
22060 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
22070 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
22080 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
22090 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
220a0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
220b0 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
220c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
220d0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
220e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
220f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
22100 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
22110 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
22120 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
22130 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
22140 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
22150 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
22160 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
22170 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
22180 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
22190 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
221a0 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
221b0 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
221c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
221d0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
221e0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64  ..  /* Set the d
221f0 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63  atabase size bac
22200 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  k to the value i
22210 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65  t was before the
22220 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
22230 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20   being reverted 
22240 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  was opened..  */
22250 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
22260 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f  e = pSavepoint ?
22270 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72   pSavepoint->nOr
22280 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f  ig : pPager->dbO
22290 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  rigSize;.  pPage
222a0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
222b0 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
222c0 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70  pFile;..  if( !p
222d0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67  Savepoint && pag
222e0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
222f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
22300 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
22310 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
22320 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
22330 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
22340 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
22350 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
22360 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
22370 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
22380 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
22390 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
223a0 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
223b0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
223c0 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
223d0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
223e0 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
223f0 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
22400 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
22410 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
22420 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
22430 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
22440 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
22450 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
22460 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20   || szJ==0 );.. 
22470 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
22480 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
22490 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
224a0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
224b0 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
224c0 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
224d0 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
224e0 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
224f0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
22500 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
22510 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
22520 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
22530 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
22540 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
22550 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
22560 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
22570 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
22580 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
22590 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
225a0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
225b0 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
225c0 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
225d0 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
225e0 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
225f0 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21   pSavepoint && !
22600 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
22610 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  er) ){.    iHdrO
22620 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
22630 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
22640 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
22650 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
22660 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22670 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
22680 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
22690 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
226a0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
226b0 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
226c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
226d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
226e0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
226f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22700 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
22710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22720 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
22730 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ONE );.  }else{.
22740 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
22750 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a  nalOff = 0;.  }.
22760 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72  .  /* Continue r
22770 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
22780 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  rds out of the m
22790 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
227a0 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65  ting at.  ** the
227b0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
227c0 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63  eader seen and c
227d0 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20  ontinuing until 
227e0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e  the effective en
227f0 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61  d.  ** of the ma
22800 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
22810 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b    Continue to sk
22820 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  ip out-of-range 
22830 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63  pages and.  ** c
22840 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70  ontinue adding p
22850 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
22860 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a   to pDone..  */.
22870 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
22880 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
22890 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
228a0 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
228b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
228c0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
228d0 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b    u32 nJRec = 0;
228e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
228f0 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
22900 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
22910 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
22920 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
22930 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52  er, 0, szJ, &nJR
22940 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
22950 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22960 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20  ITE_DONE );..   
22970 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22   /*.    ** The "
22980 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
22990 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
229a0 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
229b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20  r->journalOff". 
229c0 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65     ** test is re
229d0 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20  lated to ticket 
229e0 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20  #2565.  See the 
229f0 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68  discussion in th
22a00 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70  e.    ** pager_p
22a10 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69  layback() functi
22a20 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
22a30 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
22a40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a     */.    if( nJ
22a50 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
22a60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
22a70 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
22a80 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
22a90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
22aa0 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
22ab0 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
22ac0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22ad0 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
22ae0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
22af0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
22b00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22b10 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
22b20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
22b30 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
22b40 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
22b50 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
22b60 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
22b70 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
22b80 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
22b90 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
22ba0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
22bb0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
22bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
22bd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22be0 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  >=szJ );..  /* F
22bf0 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
22c00 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
22c10 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
22c20 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
22c30 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
22c40 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
22c50 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
22c60 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
22c70 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
22c80 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
22c90 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
22ca0 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
22cb0 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
22cc0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
22cd0 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
22ce0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
22cf0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
22d00 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
22d10 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
22d20 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
22d30 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69  ageSize);..    i
22d40 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
22d50 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
22d60 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53  rc = sqlite3WalS
22d70 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61  avepointUndo(pPa
22d80 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65  ger->pWal, pSave
22d90 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29  point->aWalData)
22da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
22db0 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
22dc0 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
22dd0 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
22de0 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
22df0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
22e00 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69  ( offset==(i64)i
22e10 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
22e20 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
22e30 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
22e40 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
22e50 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
22e60 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
22e70 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
22e80 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
22e90 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
22ea0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
22eb0 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
22ec0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22ed0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22ee0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
22ef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22f00 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22f10 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
22f20 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
22f30 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
22f40 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
22f50 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63  empting to recyc
22f60 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75  le clean and unu
22f70 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f  sed pages..*/.vo
22f80 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
22f90 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
22fa0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
22fb0 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
22fc0 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
22fd0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
22fe0 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
22ff0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
23000 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
23010 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
23020 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
23030 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61  owed.** before a
23040 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69  ttempting to spi
23050 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72  ll pages to jour
23060 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
23070 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
23080 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
23090 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
230a0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
230b0 33 50 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73  3PcacheSetSpills
230c0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
230d0 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
230e0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51  ./*.** Invoke SQ
230f0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
23100 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68  SIZE based on th
23110 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
23120 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74  of szMmap..*/.st
23130 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
23140 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72  ixMaplimit(Pager
23150 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53   *pPager){.#if S
23160 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
23170 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f  IZE>0.  sqlite3_
23180 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
23190 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f  r->fd;.  if( isO
231a0 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70  pen(fd) && fd->p
231b0 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
231c0 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69  n>=3 ){.    sqli
231d0 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20  te3_int64 sz;.  
231e0 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73    sz = pPager->s
231f0 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65  zMmap;.    pPage
23200 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28  r->bUseFetch = (
23210 73 7a 3e 30 29 3b 0a 20 20 20 20 73 65 74 47 65  sz>0);.    setGe
23220 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65  tterMethod(pPage
23230 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  r);.    sqlite3O
23240 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
23250 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
23260 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
23270 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23  IZE, &sz);.  }.#
23280 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
23290 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
232a0 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65  m size of any me
232b0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64  mory mapping mad
232c0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
232d0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
232e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
232f0 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  mapLimit(Pager *
23300 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f  pPager, sqlite3_
23310 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
23320 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20   pPager->szMmap 
23330 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65  = szMmap;.  page
23340 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
23350 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ger);.}../*.** F
23360 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
23370 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
23380 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  rom the pager..*
23390 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
233a0 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20  gerShrink(Pager 
233b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
233c0 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28  te3PcacheShrink(
233d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
233e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
233f0 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68  t settings of th
23400 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65  e pager to those
23410 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
23420 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65  e pgFlags parame
23430 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ter..**.** The "
23440 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67  level" in pgFlag
23450 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
23460 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20  ONOUS_MASK sets 
23470 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a  the robustness.*
23480 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
23490 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
234a0 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72  to OS crashes or
234b0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
234c0 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  by.** changing t
234d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
234e0 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
234f0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e  ng the journals.
23500 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66 6f  .** There are fo
23510 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ur levels:.**.**
23520 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
23530 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
23540 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
23550 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
23560 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
23570 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
23580 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
23590 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
235a0 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
235b0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
235c0 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
235d0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
235e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
235f0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
23600 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
23610 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
23620 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
23630 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
23640 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
23650 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
23660 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
23670 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
23680 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
23690 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
236a0 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
236b0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
236c0 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
236d0 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
236e0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
236f0 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
23700 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
23710 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
23720 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
23730 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
23740 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
23750 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
23760 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
23770 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
23780 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
23790 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
237a0 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
237b0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
237c0 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
237d0 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
237e0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
237f0 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
23810 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
23820 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
23830 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
23840 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
23850 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
23860 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
23870 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
23880 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
23890 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
238a0 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
238b0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
238c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
238d0 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
238e0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
238f0 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
23900 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ollback..**.**  
23910 20 20 45 58 54 52 41 20 20 20 20 20 54 68 69 73    EXTRA     This
23920 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78   is like FULL ex
23930 63 65 70 74 20 74 68 61 74 20 69 73 20 61 6c 73  cept that is als
23940 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69 72 65  o syncs the dire
23950 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  ctory.**        
23960 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61        that conta
23970 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ins the rollback
23980 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20 74   journal after t
23990 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20  he rollback.**  
239a0 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
239b0 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e  nal is unlinked.
239c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
239d0 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
239e0 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
239f0 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
23a00 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
23a10 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
23a20 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
23a30 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
23a40 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
23a50 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
23a60 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
23a70 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
23a80 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
23a90 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
23aa0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
23ab0 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
23ac0 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
23ad0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
23ae0 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
23af0 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
23b00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
23b10 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
23b20 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
23b30 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
23b40 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
23b50 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
23b60 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
23b70 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
23b80 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
23b90 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
23ba0 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
23bb0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
23bc0 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
23bd0 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
23be0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
23bf0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
23c00 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54   FULL.** and EXT
23c10 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e  RA for WAL mode.
23c20 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
23c30 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
23c40 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
23c50 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
23c60 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
23c70 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
23c80 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
23c90 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
23ca0 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
23cb0 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
23cc0 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
23cd0 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
23ce0 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
23cf0 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
23d00 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
23d10 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
23d20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
23d30 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
23d40 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
23d50 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
23d60 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
23d70 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
23d80 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
23d90 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
23da0 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
23db0 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
23dc0 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
23dd0 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
23de0 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
23df0 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
23e00 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
23e10 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
23e20 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
23e30 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
23e40 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
23e50 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
23e60 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
23e70 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
23e80 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
23e90 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  gs(.  Pager *pPa
23ea0 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
23eb0 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20  he pager to set 
23ec0 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72  safety level for
23ed0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
23ee0 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56  gFlags      /* V
23ef0 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  arious flags */.
23f00 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65  ){.  unsigned le
23f10 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20  vel = pgFlags & 
23f20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
23f30 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70 50  S_MASK;.  if( pP
23f40 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
23f50 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
23f60 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
23f70 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
23f80 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
23f90 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20  extraSync = 0;. 
23fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
23fb0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
23fc0 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
23fd0 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b  RONOUS_OFF ?1:0;
23fe0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
23ff0 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50  lSync = level>=P
24000 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
24010 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20  _FULL ?1:0;.    
24020 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
24030 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52  c = level==PAGER
24040 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54  _SYNCHRONOUS_EXT
24050 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69  RA ?1:0;.  }.  i
24060 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
24070 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
24080 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
24090 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
240a0 61 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c  ags & PAGER_FULL
240b0 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61  FSYNC ){.    pPa
240c0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
240d0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
240e0 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
240f0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
24100 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
24110 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50  NORMAL;.  }.  pP
24120 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
24130 67 73 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 79  gs = (pPager->sy
24140 6e 63 46 6c 61 67 73 3c 3c 32 29 3b 0a 20 20 69  ncFlags<<2);.  i
24150 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
24160 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
24170 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
24180 7c 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  |= pPager->syncF
24190 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lags;.  }.  if( 
241a0 28 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52  (pgFlags & PAGER
241b0 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 29  _CKPT_FULLFSYNC)
241c0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
241d0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
241e0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
241f0 7c 3d 20 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f  |= (SQLITE_SYNC_
24200 46 55 4c 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20  FULL<<2);.  }.  
24210 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
24220 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
24230 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
24240 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
24250 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
24260 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
24270 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
24280 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
24290 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
242a0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
242b0 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
242c0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
242d0 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
242e0 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
242f0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
24300 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
24310 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
24320 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
24330 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
24340 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
24350 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
24360 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
24370 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
24380 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
24390 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
243a0 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
243b0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
243c0 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
243d0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
243e0 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
243f0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
24400 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
24410 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
24420 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
24430 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
24440 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
24450 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
24460 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
24470 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
24480 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
24490 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
244a0 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
244b0 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
244c0 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
244d0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
244e0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
244f0 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
24500 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
24510 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
24520 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
24530 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
24540 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
24550 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
24560 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
24570 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
24580 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
24590 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
245a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
245b0 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
245c0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
245d0 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
245e0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
245f0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
24600 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
24610 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
24620 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
24630 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
24640 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
24650 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
24660 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
24670 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
24680 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
24690 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
246a0 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
246b0 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
246c0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
246d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
246e0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
246f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
24700 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
24710 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
24720 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
24730 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
24740 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
24750 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
24760 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
24770 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
24780 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
24790 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
247a0 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
247b0 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
247c0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
247d0 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
247e0 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
247f0 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
24800 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
24810 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
24820 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
24830 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
24840 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
24850 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
24860 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
24870 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
24880 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
24890 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
248a0 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
248b0 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
248c0 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
248d0 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
248e0 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
248f0 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
24900 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
24910 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
24920 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
24930 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
24940 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
24950 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24970 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
24980 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
24990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
249a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
249b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
249c0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
249d0 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
249e0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
249f0 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
24a00 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
24a10 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
24a20 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
24a30 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
24a40 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
24a50 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
24a60 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
24a70 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
24a80 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
24a90 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
24aa0 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
24ab0 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
24ac0 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
24ad0 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
24ae0 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
24af0 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
24b00 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
24b10 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
24b20 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
24b30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
24b40 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
24b50 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
24b60 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
24b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
24b80 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
24b90 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
24ba0 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
24bb0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24bc0 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
24bd0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
24be0 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
24bf0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
24c00 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
24c10 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
24c20 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70  andler */.){.  p
24c30 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
24c40 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
24c50 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
24c60 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
24c70 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
24c80 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
24c90 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
24ca0 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76    void **ap = (v
24cb0 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
24cc0 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
24cd0 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28    assert( ((int(
24ce0 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30  *)(void *))(ap[0
24cf0 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65  ]))==xBusyHandle
24d00 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
24d10 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e   ap[1]==pBusyHan
24d20 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73  dlerArg );.    s
24d30 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
24d40 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
24d50 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
24d60 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76  _BUSYHANDLER, (v
24d70 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d  oid *)ap);.  }.}
24d80 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
24d90 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
24da0 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
24db0 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
24dc0 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
24dd0 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
24de0 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
24df0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
24e00 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
24e10 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
24e20 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
24e30 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
24e40 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
24e50 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
24e60 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
24e70 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
24e80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
24e90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
24ea0 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
24eb0 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
24ec0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
24ed0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
24ee0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
24ef0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
24f00 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
24f10 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
24f20 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
24f30 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
24f40 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
24f50 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
24f60 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
24f70 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
24f80 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
24f90 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
24fa0 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
24fb0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
24fc0 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
24fd0 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
24fe0 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
24ff0 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
25000 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
25010 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
25020 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
25030 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
25040 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
25050 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
25060 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
25070 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
25080 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
25090 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
250a0 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
250b0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
250c0 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
250d0 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
250e0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
250f0 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
25100 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
25110 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
25120 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
25130 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
25140 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
25150 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
25160 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
25170 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25180 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
25190 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
251a0 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
251b0 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
251c0 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
251d0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
251e0 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
251f0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
25200 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
25210 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
25220 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
25230 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
25240 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
25250 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
25260 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
25270 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
25280 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
25290 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
252a0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
252b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
252c0 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
252d0 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
252e0 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
252f0 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
25300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25310 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
25320 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
25330 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
25340 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
25350 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
25360 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
25370 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
25380 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
25390 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
253a0 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
253b0 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
253c0 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
253d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
253e0 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
253f0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
25400 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
25410 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
25420 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
25430 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
25440 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
25450 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
25460 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
25470 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
25480 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
25490 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
254a0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
254b0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
254c0 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
254d0 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
254e0 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
254f0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
25500 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
25510 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
25520 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
25530 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
25540 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
25550 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
25560 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
25570 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
25580 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
25590 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
255a0 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
255b0 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
255c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
255d0 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
255e0 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
255f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
25600 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
25610 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
25620 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
25630 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
25640 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
25650 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
25660 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
25670 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
25680 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
25690 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
256a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
256b0 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
256c0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
256d0 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
256e0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
256f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
25700 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  EM_BKPT;.    }..
25710 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
25730 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
25740 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
25750 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50  qlite3PcacheSetP
25760 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ageSize(pPager->
25770 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a  pPCache, pageSiz
25780 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
25790 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
257a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
257b0 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
257c0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
257d0 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
257e0 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
257f0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
25800 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74  e = (Pgno)((nByt
25810 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61  e+pageSize-1)/pa
25820 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
25830 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
25840 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
25850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
25860 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e 65  ite3PageFree(pNe
25870 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  w);.    }.  }.. 
25880 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50   *pPageSize = pP
25890 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
258a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
258b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
258c0 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73  Reserve<0 ) nRes
258d0 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e  erve = pPager->n
258e0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
258f0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
25900 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30   && nReserve<100
25910 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
25920 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36  >nReserve = (i16
25930 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  )nReserve;.    p
25940 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
25950 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
25960 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
25970 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
25980 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25990 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
259a0 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
259b0 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
259c0 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
259d0 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
259e0 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
259f0 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
25a00 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
25a10 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
25a20 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
25a30 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
25a40 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
25a50 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
25a60 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
25a70 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
25a80 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
25a90 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
25aa0 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
25ab0 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
25ac0 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
25ad0 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
25ae0 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
25af0 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
25b00 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
25b10 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
25b20 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
25b30 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
25b40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
25b50 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
25b60 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
25b70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
25b80 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
25b90 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
25ba0 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
25bb0 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
25bc0 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
25bd0 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
25be0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
25bf0 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
25c00 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
25c10 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
25c20 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
25c30 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
25c40 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
25c50 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
25c60 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
25c70 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
25c80 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
25c90 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
25ca0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
25cb0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
25cc0 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Page;.  }.  asse
25cd0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25ce0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
25cf0 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64  ;      /* Called
25d00 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50   only by OP_MaxP
25d10 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74  gcnt */.  assert
25d20 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
25d30 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  >=pPager->dbSize
25d40 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67   );  /* OP_MaxPg
25d50 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69  cnt enforces thi
25d60 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50  s */.  return pP
25d70 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
25d80 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
25d90 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
25da0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
25db0 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
25dc0 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
25dd0 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
25de0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
25df0 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
25e00 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
25e10 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
25e20 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
25e30 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
25e40 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
25e50 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
25e60 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
25e70 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
25e80 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
25e90 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
25ea0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
25eb0 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
25ec0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
25ed0 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
25ee0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
25ef0 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
25f00 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
25f10 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
25f20 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
25f30 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
25f40 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
25f50 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
25f60 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
25f70 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
25f80 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
25f90 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
25fa0 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
25fb0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
25fc0 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
25fd0 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
25fe0 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
25ff0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
26000 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
26010 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
26020 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
26030 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
26040 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
26050 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
26060 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
26070 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
26080 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
26090 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
260a0 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ager was opened 
260b0 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  on a transient f
260c0 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ile (zFilename==
260d0 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65  ""), or.** opene
260e0 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73  d on a file less
260f0 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e   than N bytes in
26100 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75   size, the outpu
26110 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a  t buffer is.** z
26120 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45  eroed and SQLITE
26130 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
26140 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20  e rationale for 
26150 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
26160 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
26170 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
26180 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c  atabase headers,
26190 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73   and a new trans
261a0 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20  ient or.** zero 
261b0 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68  sized database h
261c0 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e  as a header than
261d0 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
261e0 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a  ly of zeroes..**
261f0 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72  .** If any IO er
26200 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53  ror apart from S
26210 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
26220 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e  T_READ is encoun
26230 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  tered,.** the er
26240 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
26250 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
26260 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  er and the conte
26270 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  nts of the.** ou
26280 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65  tput buffer unde
26290 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fined..*/.int sq
262a0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
262b0 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
262c0 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
262d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
262e0 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
262f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
26300 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
26310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
26320 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
26330 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
26340 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ile );..  /* Thi
26350 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
26360 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65  y called by btre
26370 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  e immediately af
26380 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  ter creating.  *
26390 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  * the Pager obje
263a0 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e  ct.  There has n
263b0 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72  ot been an oppor
263c0 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69  tunity to transi
263d0 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c  tion.  ** to WAL
263e0 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a   mode yet..  */.
263f0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
26400 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
26410 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  ;..  if( isOpen(
26420 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
26430 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
26440 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
26450 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
26460 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
26470 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
26480 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20  est, N, 0);.    
26490 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
264a0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
264b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
264c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
264d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
264e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
264f0 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
26500 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
26510 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
26520 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20  n is open on.** 
26530 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72 65  the pager. It re
26540 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
26550 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
26560 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
26570 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  .**.** However, 
26580 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62  if the file is b
26590 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61  etween 1 and <pa
265a0 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69  ge-size> bytes i
265b0 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a  n size, then .**
265c0 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65   this is conside
265d0 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c  red a 1 page fil
265e0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
265f0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
26600 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
26610 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
26620 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26630 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
26640 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
26650 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
26660 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  !=PAGER_WRITER_F
26670 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e  INISHED );.  *pn
26680 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67  Page = (int)pPag
26690 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a  er->dbSize;.}...
266a0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
266b0 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
266c0 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74  pe locktype on t
266d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
266e0 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61  . If.** a simila
266f0 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  r or greater loc
26700 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
26710 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
26720 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28   is a no-op.** (
26730 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
26740 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29  _OK immediately)
26750 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
26760 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  e, attempt to ob
26770 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73  tain the lock us
26780 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  ing sqlite3OsLoc
26790 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20  k(). Invoke .** 
267a0 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
267b0 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  k if the lock is
267c0 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
267d0 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74  vailable. Repeat
267e0 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62   .** until the b
267f0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
26800 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e  urns false or un
26810 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20  til the attempt 
26820 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68  to .** obtain th
26830 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
26840 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
26850 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
26860 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
26870 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
26880 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
26890 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
268a0 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75  k is obtained su
268b0 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20  ccessfully, set 
268c0 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20  the Pager.state 
268d0 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20  .** variable to 
268e0 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20  locktype before 
268f0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
26900 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
26910 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
26920 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
26930 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
26940 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
26950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26960 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
26970 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
26980 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68  hat this is eith
26990 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61  er a no-op (beca
269a0 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65  use the requeste
269b0 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20  d lock is .  ** 
269c0 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f  already held), o
269d0 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
269e0 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68  nsitions that th
269f0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20  e busy-handler. 
26a00 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b   ** may be invok
26a10 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72  ed during, accor
26a20 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d  ding to the comm
26a30 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73  ent above.  ** s
26a40 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
26a50 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a  syhandler()..  *
26a60 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  /.  assert( (pPa
26a70 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b  ger->eLock>=lock
26a80 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  type).       || 
26a90 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
26aa0 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  NO_LOCK && lockt
26ab0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
26ac0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
26ad0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45  ger->eLock==RESE
26ae0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63  RVED_LOCK && loc
26af0 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
26b00 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64  _LOCK).  );..  d
26b10 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  o {.    rc = pag
26b20 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
26b30 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77   locktype);.  }w
26b40 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
26b50 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d  _BUSY && pPager-
26b60 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  >xBusyHandler(pP
26b70 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
26b80 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75  erArg) );.  retu
26b90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26ba0 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
26bb0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26bc0 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
26bd0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
26be0 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
26bf0 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
26c00 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
26c10 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
26c20 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
26c30 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
26c40 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
26c50 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
26c60 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
26c70 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
26c80 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
26c90 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
26ca0 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
26cb0 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
26cc0 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
26cd0 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
26ce0 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
26cf0 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
26d00 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
26d10 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
26d20 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
26d30 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
26d40 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
26d50 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
26d60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
26d70 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
26d80 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
26d90 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
26da0 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
26db0 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
26dc0 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
26dd0 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
26de0 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
26df0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
26e00 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
26e10 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
26e20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
26e30 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
26e40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
26e50 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
26e60 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
26e70 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
26e80 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
26e90 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
26ea0 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20  havior would be 
26eb0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
26ec0 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
26ed0 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
26ee0 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
26ef0 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
26f00 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
26f10 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
26f20 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
26f30 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
26f40 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
26f50 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
26f60 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
26f70 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
26f80 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
26f90 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
26fa0 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
26fb0 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
26fc0 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
26fd0 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
26fe0 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
26ff0 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
27000 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
27010 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
27020 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
27030 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
27040 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
27050 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
27060 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
27070 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
27080 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
27090 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
270a0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
270b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
270c0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
270d0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
270e0 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
270f0 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
27100 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
27110 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
27120 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
27130 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
27140 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
27150 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
27160 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
27170 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
27180 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
27190 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
271a0 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
271b0 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
271c0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
271d0 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
271e0 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
271f0 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
27200 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
27210 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
27220 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
27230 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
27240 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
27250 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
27260 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
27270 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
27280 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
27290 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
272a0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
272b0 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
272c0 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
272d0 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74  ction..** Once t
272e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
272f0 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
27300 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e transaction mu
27310 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20  st either be.** 
27320 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63  rolled back or c
27330 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20  ommitted. It is 
27340 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c  not safe to call
27350 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
27360 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69  nd.** then conti
27370 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  nue writing to t
27380 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
27390 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
273a0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
273b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
273c0 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
273d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
273e0 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
273f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27400 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
27410 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
27420 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
27430 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a  e = nPage;..  /*
27440 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
27450 65 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c  e code here call
27460 65 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ed assertTruncat
27470 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f  eConstraint() to
27480 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61  .  ** ensure tha
27490 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e  t all pages bein
274a0 67 20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79  g truncated away
274b0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
274c0 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20  on are,.  ** if 
274d0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
274e0 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c  points are open,
274f0 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
27500 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
27510 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
27520 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74  they can be rest
27530 6f 72 65 64 20 69 66 20 74 68 65 20 73 61 76 65  ored if the save
27540 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a  point is rolled.
27550 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20    ** back. This 
27560 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63  is no longer nec
27570 65 73 73 61 72 79 20 61 73 20 74 68 69 73 20 66  essary as this f
27580 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f  unction is now o
27590 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20  nly.  ** called 
275a0 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
275b0 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
275c0 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75  ction. So althou
275d0 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  gh the .  ** Pag
275e0 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74  er object may st
275f0 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61  ill have open sa
27600 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e  vepoints (Pager.
27610 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20  nSavepoint!=0), 
27620 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f  .  ** they canno
27630 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
27640 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72 74 54  . So the assertT
27650 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
27660 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73  t() call.  ** is
27670 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65   no longer corre
27680 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ct. */.}.../*.**
27690 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
276a0 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
276b0 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
276c0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
276d0 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
276e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
276f0 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
27700 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
27710 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
27720 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
27730 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
27740 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
27750 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
27760 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
27770 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
27780 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
27790 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
277a0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
277b0 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
277c0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
277d0 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
277e0 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
277f0 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
27800 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
27810 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
27820 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
27830 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
27840 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
27850 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
27860 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
27870 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
27880 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
27890 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
278a0 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
278b0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
278c0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
278d0 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
278e0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
278f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
27900 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
27910 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
27920 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
27930 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
27940 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
27950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
27960 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
27970 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
27980 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
27990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
279a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
279b0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
279c0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
279d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
279e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
279f0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
27a00 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
27a10 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72  /*.** Obtain a r
27a20 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65  eference to a me
27a30 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
27a40 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65   object for page
27a50 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a   number pgno. .*
27a60 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
27a70 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f   will use the po
27a80 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74  inter pData, obt
27a90 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63  ained from xFetc
27aa0 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  h()..** If succe
27ab0 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61  ssful, set *ppPa
27ac0 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ge to point to t
27ad0 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65  he new page refe
27ae0 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74  rence.** and ret
27af0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
27b00 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
27b10 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
27b20 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a   code and set.**
27b30 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f   *ppPage to zero
27b40 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66  ..**.** Page ref
27b50 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64  erences obtained
27b60 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
27b70 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
27b80 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   be released.** 
27b90 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72  by calling pager
27ba0 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29  ReleaseMapPage()
27bb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27bc0 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
27bd0 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
27be0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
27bf0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
27c00 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  object */.  Pgno
27c10 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
27c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
27c30 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
27c40 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20  void *pData,    
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c60 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61  /* xFetch()'d da
27c70 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ta for this page
27c80 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70   */.  PgHdr **pp
27c90 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20  Page            
27ca0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63        /* OUT: Ac
27cb0 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65  quired page obje
27cc0 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ct */.){.  PgHdr
27cd0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
27ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
27cf0 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
27d00 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
27d10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
27d20 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a  MmapFreelist ){.
27d30 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
27d40 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
27d50 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61  reelist;.    pPa
27d60 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
27d70 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  st = p->pDirty;.
27d80 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
27d90 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
27da0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 3d 38  Pager->nExtra>=8
27db0 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   );.    memset(p
27dc0 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 38 29 3b  ->pExtra, 0, 8);
27dd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
27de0 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48  pPage = p = (PgH
27df0 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  dr *)sqlite3Mall
27e00 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
27e10 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  Hdr) + pPager->n
27e20 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20  Extra);.    if( 
27e30 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
27e40 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
27e50 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
27e60 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
27e70 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
27e80 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ta);.      retur
27e90 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
27ea0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
27eb0 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64  ->pExtra = (void
27ec0 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d   *)&p[1];.    p-
27ed0 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d  >flags = PGHDR_M
27ee0 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  MAP;.    p->nRef
27ef0 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61   = 1;.    p->pPa
27f00 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
27f10 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  }..  assert( p->
27f20 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29  pExtra==(void *)
27f30 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72  &p[1] );.  asser
27f40 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29  t( p->pPage==0 )
27f50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66  ;.  assert( p->f
27f60 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50  lags==PGHDR_MMAP
27f70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
27f80 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
27f90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
27fa0 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d  nRef==1 );..  p-
27fb0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
27fc0 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61  p->pData = pData
27fd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
27fe0 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72  pOut++;..  retur
27ff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
28000 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
28010 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65  ease a reference
28020 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50   to page pPg. pP
28030 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
28040 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
28050 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c  .** earlier call
28060 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72 65   to pagerAcquire
28070 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
28080 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
28090 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50 67  eleaseMapPage(Pg
280a0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
280b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
280c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67  ->pPager;.  pPag
280d0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a  er->nMmapOut--;.
280e0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
280f0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
28100 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d  elist;.  pPager-
28110 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
28120 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28   pPg;..  assert(
28130 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
28140 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
28150 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  =3 );.  sqlite3O
28160 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
28170 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e  >fd, (i64)(pPg->
28180 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
28190 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70  pageSize, pPg->p
281a0 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
281b0 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f  Free all PgHdr o
281c0 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e  bjects stored in
281d0 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70   the Pager.pMmap
281e0 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a  Freelist list..*
281f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
28200 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50  gerFreeMapHdrs(P
28210 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
28220 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48   PgHdr *p;.  PgH
28230 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  dr *pNext;.  for
28240 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  (p=pPager->pMmap
28250 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70  Freelist; p; p=p
28260 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
28270 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
28280 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
28290 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
282a0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
282b0 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
282c0 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
282d0 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
282e0 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
282f0 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
28300 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
28310 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
28320 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
28330 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
28340 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
28350 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
28360 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
28370 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
28380 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
28390 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
283a0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
283b0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
283c0 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
283d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
283e0 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
283f0 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
28400 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
28410 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28420 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
28430 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
28440 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
28450 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
28460 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
28470 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
28480 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
28490 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
284a0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
284b0 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
284c0 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
284d0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
284e0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
284f0 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
28500 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
28510 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c  ger *pPager, sql
28520 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 75 38 20  ite3 *db){.  u8 
28530 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
28540 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
28550 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 7c  ..  assert( db |
28560 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
28570 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
28580 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
28590 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
285a0 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69   );.  disable_si
285b0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
285c0 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
285d0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
285e0 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61  );.  pagerFreeMa
285f0 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20  pHdrs(pPager);. 
28600 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43   /* pPager->errC
28610 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ode = 0; */.  pP
28620 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
28630 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
28640 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
28650 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c  .  assert( db ||
28660 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30   pPager->pWal==0
28670 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
28680 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57  Close(pPager->pW
28690 61 6c 2c 20 64 62 2c 20 70 50 61 67 65 72 2d 3e  al, db, pPager->
286a0 77 61 6c 53 79 6e 63 46 6c 61 67 73 2c 20 70 50  walSyncFlags, pP
286b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
286c0 20 20 20 20 20 20 28 64 62 20 26 26 20 28 64 62        (db && (db
286d0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
286e0 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 29 20  _NoCkptOnClose) 
286f0 3f 20 30 20 3a 20 70 54 6d 70 29 0a 20 20 29 3b  ? 0 : pTmp).  );
28700 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  .  pPager->pWal 
28710 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61  = 0;.#endif.  pa
28720 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
28730 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
28740 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
28750 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  ck(pPager);.  }e
28760 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69  lse{.    /* If i
28770 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20  t is open, sync 
28780 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28790 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
287a0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
287b0 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  k..    ** If thi
287c0 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74  s is not done, t
287d0 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20  hen an unsynced 
287e0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  portion of the o
287f0 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20  pen journal .   
28800 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20   ** file may be 
28810 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f  played back into
28820 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
28830 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
28840 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a  e occurs .    **
28850 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68   while this is h
28860 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61  appening, the da
28870 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63  tabase could bec
28880 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20  ome corrupt..   
28890 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e   **.    ** If an
288a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
288b0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79  ile trying to sy
288c0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  nc the journal, 
288d0 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a  shift the pager.
288e0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
288f0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69  ERROR state. Thi
28900 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41  s causes UnlockA
28910 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e  ndRollback to un
28920 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20  lock the.    ** 
28930 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f  database and clo
28940 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
28950 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65  ile without atte
28960 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
28970 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72  t.    ** back or
28980 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68   finalize it. Th
28990 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20  e next database 
289a0 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74  user will have t
289b0 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  o do hot-journal
289c0 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
289d0 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e   before accessin
289e0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
289f0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
28a00 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
28a10 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
28a20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
28a30 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f  ger, pagerSyncHo
28a40 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
28a50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
28a60 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
28a70 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
28a80 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
28a90 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65  ignMalloc();.  e
28aa0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
28ab0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50  io_errors();.  P
28ac0 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53  AGERTRACE(("CLOS
28ad0 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
28ae0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f  (pPager)));.  IO
28af0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
28b00 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
28b10 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
28b20 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73  Pager->jfd);.  s
28b30 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
28b40 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c  ager->fd);.  sql
28b50 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d  ite3PageFree(pTm
28b60 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  p);.  sqlite3Pca
28b70 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  cheClose(pPager-
28b80 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64  >pPCache);..#ifd
28b90 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
28ba0 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72  DEC.  if( pPager
28bb0 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70  ->xCodecFree ) p
28bc0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
28bd0 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  e(pPager->pCodec
28be0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
28bf0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53  ert( !pPager->aS
28c00 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61  avepoint && !pPa
28c10 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
28c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
28c30 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
28c40 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
28c50 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20  ger->sjfd) );.. 
28c60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
28c70 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
28c80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
28c90 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
28ca0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
28cb0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
28cc0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
28cd0 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65   number for page
28ce0 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71   pPg..*/.Pgno sq
28cf0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
28d00 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67  mber(DbPage *pPg
28d10 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
28d20 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
28d30 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
28d40 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
28d50 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  ount for page pP
28d60 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
28d70 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
28d80 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  e *pPg){.  sqlit
28d90 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29  e3PcacheRef(pPg)
28da0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
28db0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  the journal. In 
28dc0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
28dd0 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
28de0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
28df0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
28e00 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
28e10 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
28e20 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
28e30 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  of the.** disk a
28e40 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  nd can be restor
28e50 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
28e60 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
28e70 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
28e80 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f   If the Pager.no
28e90 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
28ea0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
28eb0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
28ec0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
28ed0 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
28ee0 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
28ef0 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61  e journal-mode a
28f00 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63  nd the .** devic
28f10 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
28f20 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79  s of the file-sy
28f30 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
28f40 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
28f50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28f60 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
28f70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
28f80 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
28f90 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
28fa0 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
28fb0 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
28fc0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
28fd0 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
28fe0 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
28ff0 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
29000 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
29010 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
29020 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
29030 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
29040 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
29050 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
29060 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
29070 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
29080 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
29090 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
290a0 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
290b0 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
290c0 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
290d0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
290e0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
290f0 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
29100 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
29110 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
29120 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
29130 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
29140 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
29150 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
29160 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
29170 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
29180 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
29190 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
291a0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
291b0 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
291c0 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
291d0 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
291e0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
291f0 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
29200 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
29210 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
29220 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
29230 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
29240 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
29250 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
29260 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
29270 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
29280 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
29290 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  rs the PGHDR_NEE
292a0 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65  D_SYNC flag of e
292b0 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75  very .** page cu
292c0 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20  rrently held in 
292d0 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65  memory before re
292e0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
292f0 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65  K. If an IO.** e
29300 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
29310 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  red, then the IO
29320 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
29330 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
29340 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
29350 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
29360 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
29370 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69  int newHdr){.  i
29380 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
293a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
293b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
293c0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
293d0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
293e0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
293f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
29400 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
29410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
29420 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
29430 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
29440 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
29450 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
29460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29470 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
29480 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
29490 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
294a0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
294b0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
294c0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
294d0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
294e0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
294f0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
29500 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
29510 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
29520 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
29530 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
29540 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
29550 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
29560 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
29570 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
29580 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
29590 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
295a0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
295b0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
295c0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
295d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
295e0 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
295f0 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
29600 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
29610 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
29620 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
29630 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
29640 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
29650 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
29660 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
29670 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
29680 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
29690 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
296a0 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
296b0 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
296c0 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
296d0 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
296e0 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
296f0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
29700 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
29710 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
29720 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
29730 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
29740 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
29750 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
29760 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f  ion's transactio
29770 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
29780 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
29790 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
297a0 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
297b0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
297c0 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
297d0 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
297e0 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
297f0 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
29800 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
29810 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
29820 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
29830 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
29840 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
29850 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
29860 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
29870 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
29880 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
29890 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
298a0 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
298b0 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
298c0 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
298d0 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
298e0 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
298f0 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
29900 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
29910 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
29920 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
29930 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
29940 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
29950 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
29960 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
29970 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
29980 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
29990 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
299a0 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
299b0 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
299c0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
299d0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
299e0 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
299f0 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
29a00 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
29a10 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
29a20 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
29a30 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
29a40 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
29a50 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
29a60 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
29a70 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
29a80 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
29a90 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
29aa0 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
29ab0 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
29ac0 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
29ad0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
29ae0 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
29af0 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
29b00 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
29b10 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
29b20 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
29b30 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
29b40 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
29b50 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  xtHdrOffset;.   
29b60 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
29b70 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48  ];.        u8 zH
29b80 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
29b90 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a  urnalMagic)+4];.
29ba0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
29bb0 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
29bc0 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
29bd0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
29be0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
29bf0 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
29c00 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
29c10 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
29c20 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
29c30 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
29c40 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
29c50 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
29c60 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
29c70 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
29c80 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
29c90 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
29ca0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29cb0 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
29cc0 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
29cd0 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
29ce0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
29cf0 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
29d00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
29d10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
29d20 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
29d30 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
29d40 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
29d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29d60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29d70 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
29d80 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
29d90 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
29da0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29db0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
29dc0 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
29dd0 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
29de0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
29df0 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
29e00 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
29e10 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
29e20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
29e30 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
29e40 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
29e50 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
29e60 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
29e70 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
29e80 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
29e90 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
29ea0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
29eb0 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
29ec0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29ed0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
29ee0 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
29ef0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
29f00 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
29f10 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
29f20 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
29f30 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
29f40 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
29f50 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
29f60 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
29f70 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
29f80 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
29f90 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
29fa0 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
29fb0 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
29fc0 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
29fd0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
29fe0 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
29ff0 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
2a000 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
2a010 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2a020 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
2a030 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
2a040 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
2a050 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
2a060 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
2a070 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
2a080 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
2a090 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
2a0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
2a0b0 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
2a0c0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
2a0d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a0e0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
2a0f0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
2a100 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
2a110 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a120 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2a130 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2a140 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
2a150 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20  HDR %p %lld\n", 
2a160 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2a170 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20  journalHdr));.  
2a180 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a190 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20  e3OsWrite(.     
2a1a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
2a1b0 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
2a1c0 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50  eof(zHeader), pP
2a1d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
2a1e0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2a1f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a200 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2a210 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2a220 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
2a230 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
2a240 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
2a250 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
2a260 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
2a270 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2a280 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
2a290 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
2a2a0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
2a2b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2a2c0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
2a2d0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
2a2e0 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20  syncFlags| .    
2a2f0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
2a300 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45  yncFlags==SQLITE
2a310 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
2a320 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
2a330 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
2a340 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a350 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
2a360 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
2a370 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2a380 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
2a390 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
2a3a0 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26     if( newHdr &&
2a3b0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
2a3c0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
2a3d0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  D) ){.        pP
2a3e0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
2a3f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
2a400 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
2a410 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
2a420 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a430 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2a440 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2a450 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2a460 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
2a470 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
2a480 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
2a490 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
2a4a0 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64  is in noSync mod
2a4b0 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
2a4c0 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20  ile was just .  
2a4d0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
2a4e0 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77  synced. Either w
2a4f0 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ay, clear the PG
2a500 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
2a510 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20  ag on .  ** all 
2a520 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  pages..  */.  sq
2a530 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
2a540 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
2a550 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50  ->pPCache);.  pP
2a560 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2a570 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
2a580 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  D;.  assert( ass
2a590 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
2a5a0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
2a5b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2a5c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
2a5d0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
2a5e0 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
2a5f0 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
2a600 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
2a610 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
2a620 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
2a630 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
2a640 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
2a650 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
2a660 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
2a670 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2a680 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
2a690 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
2a6a0 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
2a6b0 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
2a6c0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
2a6d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
2a6e0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
2a6f0 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
2a700 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
2a710 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
2a720 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
2a730 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
2a740 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
2a750 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
2a760 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
2a770 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
2a780 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
2a790 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
2a7a0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
2a7b0 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
2a7c0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
2a7d0 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
2a7e0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
2a7f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a800 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
2a810 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
2a820 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
2a830 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
2a840 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
2a850 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
2a860 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
2a870 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
2a880 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
2a890 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
2a8a0 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
2a8b0 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
2a8c0 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
2a8d0 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
2a8e0 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
2a8f0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
2a900 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2a910 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
2a920 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
2a930 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
2a940 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
2a950 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
2a960 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
2a970 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2a980 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
2a990 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
2a9a0 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
2a9b0 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
2a9c0 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
2a9d0 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
2a9e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
2a9f0 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
2aa00 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
2aa10 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
2aa20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
2aa30 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
2aa40 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
2aa50 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
2aa60 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
2aa70 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
2aa80 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
2aa90 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
2aaa0 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
2aab0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
2aac0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
2aad0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
2aae0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2aaf0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
2ab00 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2ab10 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2ab20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
2ab30 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2ab40 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
2ab50 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
2ab60 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
2ab70 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
2ab80 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
2ab90 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2aba0 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
2abb0 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50  gelist(Pager *pP
2abc0 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69  ager, PgHdr *pLi
2abd0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
2abe0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2ac00 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2ac10 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
2ac20 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
2ac30 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61   for rollback pa
2ac40 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44  gers in WRITER_D
2ac50 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  BMOD state. */. 
2ac60 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
2ac70 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
2ac80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ac90 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 70  r->tempFile || p
2aca0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2acb0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
2acc0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
2acd0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
2ace0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
2acf0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2ad00 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2ad10 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30  pList->pDirty==0
2ad20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2ad30 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
2ad40 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
2ad50 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
2ad60 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
2ad70 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
2ad80 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
2ad90 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
2ada0 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
2adb0 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
2adc0 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
2add0 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
2ade0 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
2adf0 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
2ae00 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2ae10 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
2ae20 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
2ae30 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
2ae40 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
2ae50 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
2ae60 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2ae70 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
2ae80 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
2ae90 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   Before the firs
2aea0 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68  t write, give th
2aeb0 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20  e VFS a hint of 
2aec0 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  what the final. 
2aed0 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69   ** file size wi
2aee0 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  ll be..  */.  as
2aef0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2af00 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
2af10 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69  ager->fd) );.  i
2af20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2af30 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e   .   && pPager->
2af40 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65  dbHintSize<pPage
2af50 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20  r->dbSize.   && 
2af60 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c  (pList->pDirty |
2af70 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50  | pList->pgno>pP
2af80 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
2af90 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
2afa0 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20  e3_int64 szFile 
2afb0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
2afc0 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e  ze * (sqlite3_in
2afd0 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69  t64)pPager->dbSi
2afe0 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ze;.    sqlite3O
2aff0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
2b000 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
2b010 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
2b020 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20  INT, &szFile);. 
2b030 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
2b040 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
2b050 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77  dbSize;.  }..  w
2b060 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2b070 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
2b080 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
2b090 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
2b0a0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
2b0b0 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
2b0c0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
2b0d0 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
2b0e0 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
2b0f0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
2b100 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
2b110 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
2b120 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
2b130 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
2b140 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
2b150 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
2b160 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
2b170 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
2b180 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
2b190 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
2b1a0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
2b1b0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
2b1c0 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
2b1d0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
2b1e0 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
2b1f0 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
2b200 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
2b210 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
2b220 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
2b230 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
2b240 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
2b250 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
2b260 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
2b270 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
2b280 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
2b290 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
2b2a0 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
2b2b0 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
2b2c0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
2b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
2b300 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
2b310 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74    assert( (pList
2b320 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2b330 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
2b340 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
2b350 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
2b360 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
2b370 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20  ter(pList);..   
2b380 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
2b390 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
2b3a0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
2b3b0 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
2b3c0 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
2b3d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2b3e0 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  T, pData);..    
2b3f0 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74    /* Write out t
2b400 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f  he page data. */
2b410 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2b420 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
2b430 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
2b440 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2b450 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20  offset);..      
2b460 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73  /* If page 1 was
2b470 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75   just written, u
2b480 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69  pdate Pager.dbFi
2b490 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a  leVers to match.
2b4a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
2b4b0 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e  ue now stored in
2b4c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b4d0 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74  le. If writing t
2b4e0 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61  his .      ** pa
2b4f0 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61  ge caused the da
2b500 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
2b510 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69  row, update dbFi
2b520 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a  leSize. .      *
2b530 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  /.      if( pgno
2b540 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
2b550 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
2b560 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
2b570 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
2b580 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2b590 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2b5a0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
2b5b0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
2b5c0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2b5d0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
2b5e0 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
2b5f0 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
2b600 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
2b610 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  ]++;..      /* U
2b620 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70  pdate any backup
2b630 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67   objects copying
2b640 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2b650 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a   this pager. */.
2b660 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
2b670 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
2b680 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
2b690 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61   (u8*)pList->pDa
2b6a0 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45  ta);..      PAGE
2b6b0 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25  RTRACE(("STORE %
2b6c0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
2b6d0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
2b6f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
2b700 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
2b710 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20  h(pList)));.    
2b720 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
2b730 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
2b740 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
2b750 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
2b760 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
2b770 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d  db_count);.    }
2b780 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
2b790 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45  RTRACE(("NOSTORE
2b7a0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2b7b0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2b7c0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20   pgno));.    }. 
2b7d0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
2b7e0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20  ehash(pList);.  
2b7f0 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
2b800 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20  >pDirty;.  }..  
2b810 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b820 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20  .** Ensure that 
2b830 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2b840 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66  file is open. If
2b850 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
2b860 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  pen, this .** fu
2b870 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2b880 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  p..**.** SQLITE_
2b890 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
2b8a0 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
2b8b0 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70  s according to p
2b8c0 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49  lan. An .** SQLI
2b8d0 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
2b8e0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2b8f0 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f  ned if a call to
2b900 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29   sqlite3OsOpen()
2b910 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73   .** fails..*/.s
2b920 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75  tatic int openSu
2b930 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  bJournal(Pager *
2b940 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2b950 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2b960 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
2b970 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
2b980 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
2b990 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s =  SQLITE_OPEN
2b9a0 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51  _SUBJOURNAL | SQ
2b9b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2b9c0 49 54 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c  ITE .      | SQL
2b9d0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
2b9e0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  | SQLITE_OPEN_EX
2b9f0 43 4c 55 53 49 56 45 20 0a 20 20 20 20 20 20 7c  CLUSIVE .      |
2ba00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
2ba10 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20  ETEONCLOSE;.    
2ba20 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d  int nStmtSpill =
2ba30 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e   sqlite3Config.n
2ba40 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69  StmtSpill;.    i
2ba50 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2ba60 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2ba70 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2ba80 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
2ba90 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
2baa0 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d    nStmtSpill = -
2bab0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  1;.    }.    rc 
2bac0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2bad0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
2bae0 73 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a  s, 0, pPager->sj
2baf0 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74  fd, flags, nStmt
2bb00 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65  Spill);.  }.  re
2bb10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2bb20 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72  * Append a recor
2bb30 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
2bb40 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70   state of page p
2bb50 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  Pg to the sub-jo
2bb60 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  urnal. .**.** If
2bb70 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
2bb80 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   the bit corresp
2bb90 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70  onding to pPg->p
2bba0 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65  gno in the bitve
2bbb0 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70  cs.** for all op
2bbc0 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65  en savepoints be
2bbd0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2bbe0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2bbf0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
2bc00 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
2bc10 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2bc20 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  l, an IO.** erro
2bc30 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74  r code if the at
2bc40 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
2bc50 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2bc60 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
2bc70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
2bc80 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77  a malloc fails w
2bc90 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62  hile setting a b
2bca0 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e  it in a savepoin
2bcb0 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a  t.** bitvec..*/.
2bcc0 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
2bcd0 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20  urnalPage(PgHdr 
2bce0 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pPg){.  int rc 
2bcf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
2bd00 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2bd10 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
2bd20 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2bd30 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2bd40 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
2bd50 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
2bd60 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66   sub-journal, if
2bd70 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
2bd80 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ady been opened 
2bd90 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2bda0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2bdb0 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
2bdc0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2bdd0 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65  jfd) || pagerUse
2bde0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
2bdf0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
2be00 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2be10 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  || pPager->nSubR
2be20 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
2be30 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
2be40 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
2be50 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72     || pageInJour
2be60 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29  nal(pPager, pPg)
2be70 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50   .         || pP
2be80 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
2be90 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20  dbOrigSize .    
2bea0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  );.    rc = open
2beb0 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
2bec0 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  r);..    /* If t
2bed0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77  he sub-journal w
2bee0 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73  as opened succes
2bef0 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61  sfully (or was a
2bf00 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20  lready open),.  
2bf10 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a    ** write the j
2bf20 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e  ournal record in
2bf30 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f  to the file.  */
2bf40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2bf50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bf60 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
2bf70 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  g->pData;.      
2bf80 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36  i64 offset = (i6
2bf90 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  4)pPager->nSubRe
2bfa0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
2bfb0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68  eSize);.      ch
2bfc0 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 23 69 66  ar *pData2;..#if
2bfd0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
2bfe0 43 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 21  C   .      if( !
2bff0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
2c000 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20  mory ){.        
2c010 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
2c020 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
2c030 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
2c040 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44  E_NOMEM_BKPT, pD
2c050 61 74 61 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ata2);.      }el
2c060 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
2c070 70 44 61 74 61 32 20 3d 20 70 44 61 74 61 3b 0a  pData2 = pData;.
2c080 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2c090 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
2c0a0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2c0b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2c0c0 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2c0d0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
2c0e0 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
2c0f0 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
2c100 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2c110 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c120 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2c130 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2c140 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
2c150 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
2c160 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
2c170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c180 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2c190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
2c1a0 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
2c1b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2c1c0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
2c1d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
2c1e0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
2c1f0 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
2c200 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2c210 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
2c220 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
2c230 61 67 65 49 66 52 65 71 75 69 72 65 64 28 50 67  ageIfRequired(Pg
2c240 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
2c250 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2c260 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 65  e(pPg) ){.    re
2c270 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c 50  turn subjournalP
2c280 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73  age(pPg);.  }els
2c290 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
2c2a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
2c2b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2c2c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
2c2d0 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
2c2e0 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
2c2f0 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
2c300 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
2c310 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
2c320 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
2c330 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
2c340 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
2c350 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
2c360 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
2c370 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
2c380 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
2c390 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
2c3a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
2c3b0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
2c3c0 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
2c3d0 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
2c3e0 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
2c3f0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2c400 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
2c410 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
2c420 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
2c430 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
2c440 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
2c450 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
2c460 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
2c470 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2c480 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
2c490 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
2c4a0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
2c4b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2c4c0 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
2c4d0 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
2c4e0 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
2c4f0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2c500 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
2c510 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
2c520 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2c530 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
2c540 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
2c550 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2c560 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2c570 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
2c580 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
2c590 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
2c5a0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2c5b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
2c5c0 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
2c5d0 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
2c5e0 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
2c5f0 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
2c600 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
2c610 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
2c620 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
2c630 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2c640 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
2c650 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
2c660 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
2c670 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
2c680 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
2c690 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
2c6a0 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
2c6b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2c6c0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
2c6d0 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
2c6e0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
2c6f0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
2c700 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
2c710 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69  tSpill NOSYNC bi
2c720 74 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  t is set during 
2c730 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67  times when doing
2c740 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20   a sync of.  ** 
2c750 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64  journal (and add
2c760 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72  ing a new header
2c770 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  ) is not allowed
2c780 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20  .  This occurs. 
2c790 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73   ** during calls
2c7a0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2c7b0 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72  Write() while tr
2c7c0 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  ying to journal 
2c7d0 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61  multiple.  ** pa
2c7e0 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ges belonging to
2c7f0 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
2c800 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2c810 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42  doNotSpill ROLLB
2c820 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74 73  ACK and OFF bits
2c830 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61   inhibits all ca
2c840 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a  che spilling.  *
2c850 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * regardless of 
2c860 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2c870 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
2c880 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20  d.  This is set 
2c890 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f  during.  ** a ro
2c8a0 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73 65  llback or by use
2c8b0 72 20 72 65 71 75 65 73 74 2c 20 72 65 73 70 65  r request, respe
2c8c0 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20  ctively..  **.  
2c8d0 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61  ** Spilling is a
2c8e0 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77  lso prohibited w
2c8f0 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20  hen in an error 
2c900 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61 74  state since that
2c910 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64   could.  ** lead
2c920 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
2c930 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68  ruption.   In th
2c940 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
2c950 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a  entation it .  *
2c960 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  * is impossible 
2c970 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63 68  for sqlite3Pcach
2c980 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20 63  eFetch() to be c
2c990 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61 74  alled with creat
2c9a0 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68  eFlag==3.  ** wh
2c9b0 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ile in the error
2c9c0 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74   state, hence it
2c9d0 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
2c9e0 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
2c9f0 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65  to.  ** be calle
2ca00 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  d in the error s
2ca10 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c  tate.  Neverthel
2ca20 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20  ess, we include 
2ca30 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74  a NEVER().  ** t
2ca40 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f  est for the erro
2ca50 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61 66  r state as a saf
2ca60 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66  eguard against f
2ca70 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20  uture changes.. 
2ca80 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2ca90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2caa0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2cab0 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65 28  _OK;.  testcase(
2cac0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2cad0 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2cae0 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65  ROLLBACK );.  te
2caf0 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2cb00 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2cb10 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20  LLFLAG_OFF );.  
2cb20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2cb30 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2cb40 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
2cb50 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2cb60 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26  >doNotSpill.   &
2cb70 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  & ((pPager->doNo
2cb80 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46  tSpill & (SPILLF
2cb90 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49  LAG_ROLLBACK|SPI
2cba0 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a  LLFLAG_OFF))!=0.
2cbb0 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
2cbc0 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
2cbd0 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b  D_SYNC)!=0).  ){
2cbe0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2cbf0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50  TE_OK;.  }..  pP
2cc00 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
2cc10 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
2cc20 28 70 50 61 67 65 72 29 20 29 7b 0a 23 69 66 6e  (pPager) ){.#ifn
2cc30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2cc40 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 20 20 2f  CONCURRENT.    /
2cc50 2a 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  * If the transac
2cc60 74 69 6f 6e 20 69 73 20 61 20 22 42 45 47 49 4e  tion is a "BEGIN
2cc70 20 43 4f 4e 43 55 52 52 45 4e 54 22 20 74 72 61   CONCURRENT" tra
2cc80 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70 61  nsaction, the pa
2cc90 67 65 20 0a 20 20 20 20 2a 2a 20 63 61 6e 6e 6f  ge .    ** canno
2cca0 74 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20  t be flushed to 
2ccb0 64 69 73 6b 2e 20 52 65 74 75 72 6e 20 65 61 72  disk. Return ear
2ccc0 6c 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ly in this case.
2ccd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
2cce0 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 29 20 72  er->pAllRead ) r
2ccf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cd00 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2cd10 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66  Write a single f
2cd20 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61  rame for this pa
2cd30 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a  ge to the log. *
2cd40 2f 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  /.    rc = subjo
2cd50 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69  urnalPageIfRequi
2cd60 72 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69  red(pPg); .    i
2cd70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cd80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2cd90 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
2cda0 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29  ager, pPg, 0, 0)
2cdb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2cdc0 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
2cdd0 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
2cde0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2cdf0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
2ce00 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  mpFile==0 ){.   
2ce10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2ce20 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61  ournalCreate(pPa
2ce30 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
2ce40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ce50 4f 4b 20 29 20 72 65 74 75 72 6e 20 70 61 67 65  OK ) return page
2ce60 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2ce70 72 63 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rc);.    }.#endi
2ce80 66 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63  f.  .    /* Sync
2ce90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2cea0 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  e if required. *
2ceb0 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66  /.    if( pPg->f
2cec0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2ced0 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50  SYNC .     || pP
2cee0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2cef0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
2cf00 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  MOD.    ){.     
2cf10 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
2cf20 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  l(pPager, 1);.  
2cf30 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72    }.  .    /* Wr
2cf40 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
2cf50 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74   of the page out
2cf60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2cf70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
2cf80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cf90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2cfa0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
2cfb0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
2cfc0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
2cfd0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2cfe0 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29  ist(pPager, pPg)
2cff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2d000 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
2d010 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
2d020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d030 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
2d040 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
2d050 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2d060 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2d070 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
2d080 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2d090 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
2d0a0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
2d0b0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2d0c0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68   .}../*.** Flush
2d0d0 20 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65   all unreference
2d0e0 64 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  d dirty pages to
2d0f0 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
2d100 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
2d110 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2d120 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
2d130 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66  r->errCode;.  if
2d140 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
2d150 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73  PgHdr *pList = s
2d160 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
2d170 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
2d180 43 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65  Cache);.    asse
2d190 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
2d1a0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
2d1b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
2d1c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
2d1d0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48  ist ){.      PgH
2d1e0 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
2d1f0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  t->pDirty;.     
2d200 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66   if( pList->nRef
2d210 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2d220 63 20 3d 20 70 61 67 65 72 53 74 72 65 73 73 28  c = pagerStress(
2d230 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70  (void*)pPager, p
2d240 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
2d250 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65       pList = pNe
2d260 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  xt;.    }.  }.. 
2d270 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d280 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
2d290 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  d initialize a n
2d2a0 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ew Pager object 
2d2b0 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
2d2c0 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70  r to it.** in *p
2d2d0 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65  pPager. The page
2d2e0 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  r should eventua
2d2f0 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20  lly be freed by 
2d300 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f  passing it.** to
2d310 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
2d320 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  se()..**.** The 
2d330 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
2d340 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74  nt is the path t
2d350 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2d360 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20  ile to open..** 
2d370 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2d380 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
2d390 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
2d3a0 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
2d3b0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
2d3c0 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
2d3d0 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f  be cached. Tempo
2d3e0 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62  rary files are b
2d3f0 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
2d400 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
2d410 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e  they are closed.
2d420 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
2d430 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
2d440 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61   .** all informa
2d450 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
2d460 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76  cache. It is nev
2d470 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
2d480 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e  sk. .** This can
2d490 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
2d4a0 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ement an in-memo
2d4b0 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
2d4c0 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61  ** The nExtra pa
2d4d0 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
2d4e0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2d4f0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
2d500 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
2d510 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65  g with each page
2d520 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
2d530 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
2d540 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a  ble to the user.
2d550 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
2d560 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
2d570 29 20 41 50 49 2e 20 20 57 68 65 6e 20 61 20 6e  ) API.  When a n
2d580 65 77 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63  ew page is alloc
2d590 61 74 65 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72  ated, the.** fir
2d5a0 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
2d5b0 69 73 20 73 70 61 63 65 20 61 72 65 20 7a 65 72  is space are zer
2d5c0 6f 65 64 20 62 75 74 20 74 68 65 20 72 65 6d 61  oed but the rema
2d5d0 69 6e 64 65 72 20 69 73 20 75 6e 69 6e 69 74 69  inder is uniniti
2d5e0 61 6c 69 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20  alized..** (The 
2d5f0 65 78 74 72 61 20 73 70 61 63 65 20 69 73 20 75  extra space is u
2d600 73 65 64 20 62 79 20 62 74 72 65 65 20 61 73 20  sed by btree as 
2d610 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
2d620 63 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ct.).**.** The f
2d630 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
2d640 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
2d650 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
2d660 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
2d670 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
2d680 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
2d690 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
2d6a0 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
2d6b0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
2d6c0 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a  GER_* flags..**.
2d6d0 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
2d6e0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
2d6f0 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
2d700 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
2d710 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
2d720 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
2d730 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
2d740 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
2d750 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
2d760 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2d770 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
2d780 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
2d790 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
2d7a0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
2d7b0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2d7c0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
2d7d0 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
2d7e0 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
2d7f0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
2d800 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
2d810 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
2d820 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
2d830 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
2d840 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2d850 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
2d860 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
2d870 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
2d880 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
2d890 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
2d8a0 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
2d8b0 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
2d8c0 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
2d8d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2d8e0 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
2d8f0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2d900 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2d910 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
2d920 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
2d930 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
2d940 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
2d950 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
2d960 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2d970 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2d980 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
2d990 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d9a0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2d9b0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
2d9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2d9d0 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
2d9e0 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
2d9f0 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2da00 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2da10 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2da20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
2da30 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
2da40 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
2da50 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
2da60 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
2da70 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2da80 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
2da90 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
2daa0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
2dab0 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
2dac0 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
2dad0 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
2dae0 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
2daf0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2db00 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
2db10 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
2db20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2db30 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2db40 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
2db50 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
2db60 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
2db70 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
2db80 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
2db90 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
2dba0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2dbb0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2dbc0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
2dbd0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
2dbe0 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
2dbf0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2dc00 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
2dc10 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
2dc20 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
2dc30 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2dc40 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
2dc50 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
2dc60 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
2dc70 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
2dc80 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
2dc90 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
2dca0 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
2dcb0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2dcc0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
2dcd0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
2dce0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
2dcf0 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
2dd00 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
2dd10 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
2dd20 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
2dd30 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
2dd40 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2dd50 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
2dd60 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2dd70 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32   PCache */.  u32
2dd80 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2dd90 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2dda0 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
2ddb0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
2ddc0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2ddd0 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  Uri = 0;    /* U
2dde0 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20  RI args to copy 
2ddf0 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  */.  int nUri = 
2de00 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
2de10 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2de20 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20   of URI args at 
2de30 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46  *zUri */..  /* F
2de40 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
2de50 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
2de60 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
2de70 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2de80 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
2de90 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
2dea0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
2deb0 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
2dec0 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72  nal).  */.  jour
2ded0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
2dee0 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72  UND8(sqlite3Jour
2def0 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a  nalSize(pVfs));.
2df00 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
2df10 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
2df20 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e   NULL in case an
2df30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
2df40 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
2df50 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2df60 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
2df70 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41    if( flags & PA
2df80 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  GER_MEMORY ){.  
2df90 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
2dfa0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2dfb0 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2dfc0 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  {.      zPathnam
2dfd0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
2dfe0 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  Dup(0, zFilename
2dff0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61  );.      if( zPa
2e000 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74  thname==0  ) ret
2e010 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2e020 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50 61  _BKPT;.      nPa
2e030 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2e040 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2e050 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65  me);.      zFile
2e060 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  name = 0;.    }.
2e070 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2e080 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
2e090 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
2e0a0 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
2e0b0 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
2e0c0 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
2e0d0 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
2e0e0 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
2e0f0 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
2e100 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
2e110 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
2e120 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
2e130 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
2e140 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2e150 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2e160 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  [0] ){.    const
2e170 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50   char *z;.    nP
2e180 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
2e190 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
2e1a0 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2e1b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
2e1c0 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29  (0, nPathname*2)
2e1d0 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
2e1e0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
2e1f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2e200 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
2e210 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
2e220 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
2e230 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
2e240 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
2e250 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
2e260 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2e270 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
2e280 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
2e290 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
2e2a0 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e  ame);.    nPathn
2e2b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2e2c0 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
2e2d0 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d  ;.    z = zUri =
2e2e0 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69   &zFilename[sqli
2e2f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
2e300 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77  ename)+1];.    w
2e310 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
2e320 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2e330 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2e340 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53     z += sqlite3S
2e350 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20  trlen30(z)+1;.  
2e360 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28    }.    nUri = (
2e370 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72  int)(&z[1] - zUr
2e380 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i);.    assert( 
2e390 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nUri>=0 );.    i
2e3a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e3b0 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
2e3c0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2e3d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
2e3e0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
2e3f0 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
2e400 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
2e410 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
2e420 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
2e430 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
2e440 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
2e450 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
2e460 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
2e470 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
2e480 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
2e490 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
2e4a0 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
2e4b0 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
2e4c0 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
2e4d0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
2e4e0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
2e4f0 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
2e500 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
2e510 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
2e520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2e530 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
2e540 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
2e550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e560 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2e570 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2e580 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2e590 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2e5a0 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
2e5b0 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
2e5c0 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
2e5d0 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
2e5e0 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
2e5f0 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
2e600 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2e610 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
2e620 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
2e630 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
2e640 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
2e650 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
2e660 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
2e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e680 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
2e690 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
2e6a0 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6c0 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
2e6d0 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
2e6e0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2e6f0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2e700 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
2e710 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
2e720 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
2e730 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2e740 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2e750 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2e760 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
2e770 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2e780 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
2e790 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
2e7a0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2e7b0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
2e7c0 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2e7d0 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
2e7e0 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
2e7f0 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
2e800 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2e810 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
2e820 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
2e830 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2e840 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
2e850 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
2e860 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
2e870 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
2e880 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
2e890 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
2e8a0 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
2e8b0 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2e8c0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
2e8d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2e8e0 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
2e8f0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2e900 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
2e910 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
2e920 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
2e930 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
2e940 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20  + nUri +        
2e950 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
2e960 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2e970 20 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20   8 + 2          
2e980 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
2e990 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2e9a0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b  E_OMIT_WAL.    +
2e9b0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b   nPathname + 4 +
2e9c0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   2            /*
2e9d0 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a   zWal */.#endif.
2e9e0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45    );.  assert( E
2e9f0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2ea00 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ENT(SQLITE_INT_T
2ea10 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c  O_PTR(journalFil
2ea20 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28  eSize)) );.  if(
2ea30 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71   !pPtr ){.    sq
2ea40 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2ea50 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
2ea60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2ea70 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  EM_BKPT;.  }.  p
2ea80 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20  Pager =         
2ea90 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50       (Pager*)(pP
2eaa0 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tr);.  pPager->p
2eab0 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61  PCache =    (PCa
2eac0 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  che*)(pPtr += RO
2ead0 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
2eae0 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72  ger)));.  pPager
2eaf0 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65  ->fd =   (sqlite
2eb00 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2eb10 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
2eb20 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ze));.  pPager->
2eb30 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  sjfd = (sqlite3_
2eb40 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2eb50 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2eb60 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72  File));.  pPager
2eb70 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65  ->jfd =  (sqlite
2eb80 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2eb90 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2eba0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
2ebb0 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61  lename =    (cha
2ebc0 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  r*)(pPtr += jour
2ebd0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2ebe0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2ebf0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61  TE_ALIGNMENT(pPa
2ec00 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
2ec10 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50  /* Fill in the P
2ec20 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61  ager.zFilename a
2ec30 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
2ec40 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65  l buffers, if re
2ec50 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
2ec60 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20   zPathname ){.  
2ec70 20 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e    assert( nPathn
2ec80 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61  ame>0 );.    pPa
2ec90 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
2eca0 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2ecb0 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20  = nPathname + 1 
2ecc0 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  + nUri);.    mem
2ecd0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
2ece0 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
2ecf0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2ed00 20 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d    if( nUri ) mem
2ed10 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69  cpy(&pPager->zFi
2ed20 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65  lename[nPathname
2ed30 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  +1], zUri, nUri)
2ed40 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2ed50 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
2ed60 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2ed70 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2ed80 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
2ed90 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2eda0 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38  -journal\000", 8
2edb0 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
2edc0 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67  FileSuffix3(pPag
2edd0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2ede0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
2edf0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2ee00 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50  _OMIT_WAL.    pP
2ee10 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50  ager->zWal = &pP
2ee20 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
2ee30 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20  Pathname+8+1];. 
2ee40 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2ee50 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ->zWal, zPathnam
2ee60 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2ee70 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2ee80 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d  r->zWal[nPathnam
2ee90 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20  e], "-wal\000", 
2eea0 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  4+1);.    sqlite
2eeb0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61  3FileSuffix3(pPa
2eec0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2eed0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23  pPager->zWal);.#
2eee0 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
2eef0 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68  3DbFree(0, zPath
2ef00 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  name);.  }.  pPa
2ef10 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
2ef20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
2ef30 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
2ef40 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
2ef50 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f  pager file..  */
2ef60 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
2ef70 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2ef80 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74   ){.    int fout
2ef90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2efa0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
2efb0 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62  flags returned b
2efc0 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20  y xOpen() */.   
2efd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
2efe0 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
2eff0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2f000 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67  ger->fd, vfsFlag
2f010 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61  s, &fout);.    a
2f020 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b  ssert( !memDb );
2f030 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2f040 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
2f050 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
2f060 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
2f070 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
2f080 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
2f090 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
2f0a0 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
2f0b0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2f0c0 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
2f0d0 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
2f0e0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2f0f0 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
2f100 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
2f110 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
2f120 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
2f130 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
2f140 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
2f150 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
2f160 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
2f170 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
2f180 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  e().    **    + 
2f190 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
2f1a0 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
2f1b0 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
2f1c0 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ally..    */.   
2f1d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f1e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
2f1f0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
2f200 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2f210 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
2f220 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 65 61  ;.      if( !rea
2f230 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
2f240 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2f250 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
2f260 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
2f270 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2f280 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2f290 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
2f2a0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61          if( szPa
2f2b0 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73  geDflt<pPager->s
2f2c0 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20  ectorSize ){.   
2f2d0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2f2e0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51  r->sectorSize>SQ
2f2f0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2f300 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
2f310 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2f320 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
2f330 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2f340 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  IZE;.          }
2f350 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2f360 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28    szPageDflt = (
2f370 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74  u32)pPager->sect
2f380 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
2f390 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69    }.        }.#i
2f3a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2f3b0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2f3c0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2f3d0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
2f3e0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2f3f0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2f400 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
2f410 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2f420 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2f430 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
2f440 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2f450 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
2f460 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2f470 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
2f480 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
2f490 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
2f4a0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2f4b0 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
2f4c0 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
2f4d0 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
2f4e0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
2f4f0 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
2f500 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2f510 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
2f520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f530 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
2f540 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
2f550 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63     pPager->noLoc
2f560 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  k = sqlite3_uri_
2f570 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d  boolean(zFilenam
2f580 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b  e, "nolock", 0);
2f590 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 63 20  .      if( (iDc 
2f5a0 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49  & SQLITE_IOCAP_I
2f5b0 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20  MMUTABLE)!=0.   
2f5c0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75      || sqlite3_u
2f5d0 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65  ri_boolean(zFile
2f5e0 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65  name, "immutable
2f5f0 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ", 0) ){.       
2f600 20 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53     vfsFlags |= S
2f610 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2f620 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67  NLY;.          g
2f630 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d  oto act_like_tem
2f640 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  p_file;.      }.
2f650 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2f660 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
2f670 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
2f680 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
2f690 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
2f6a0 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
2f6b0 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
2f6c0 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
2f6d0 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
2f6e0 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
2f6f0 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
2f700 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
2f710 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
2f720 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  rite()..    **. 
2f730 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2f740 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f  h is also run fo
2f750 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
2f760 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d  atabase. An in-m
2f770 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74  emory.    ** dat
2f780 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d  abase is the sam
2f790 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e as a temp-file
2f7a0 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77   that is never w
2f7b0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20  ritten out to.  
2f7c0 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73    ** disk and us
2f7d0 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  es an in-memory 
2f7e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2f7f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2f800 54 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f  This branch also
2f810 20 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20   runs for files 
2f820 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61  marked as immuta
2f830 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74  ble..    */ .act
2f840 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a  _like_temp_file:
2f850 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
2f860 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  1;.    pPager->e
2f870 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
2f880 41 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65  ADER;     /* Pre
2f890 74 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20  tend we already 
2f8a0 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  have a lock */. 
2f8b0 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
2f8c0 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43   = EXCLUSIVE_LOC
2f8d0 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64  K;    /* Pretend
2f8e0 20 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55   we are in EXCLU
2f8f0 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  SIVE mode */.   
2f900 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
2f910 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2f920 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63      /* Do no loc
2f930 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64  king */.    read
2f940 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73  Only = (vfsFlags
2f950 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
2f960 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DONLY);.  }..  /
2f970 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2f980 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74  call to PagerSet
2f990 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65  Pagesize() serve
2f9a0 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c  s to set the val
2f9b0 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65  ue of .  ** Page
2f9c0 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74  r.pageSize and t
2f9d0 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
2f9e0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
2f9f0 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  uffer..  */.  if
2fa00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fa10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2fa20 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
2fa30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2fa40 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
2fa50 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50  ize(pPager, &szP
2fa60 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20  ageDflt, -1);.  
2fa70 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
2fa80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
2fa90 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
2faa0 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a  e the PCache obj
2fab0 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ect. */.  if( rc
2fac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fad0 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e     nExtra = ROUN
2fae0 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  D8(nExtra);.    
2faf0 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
2fb00 38 20 26 26 20 6e 45 78 74 72 61 3c 31 30 30 30  8 && nExtra<1000
2fb10 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2fb20 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
2fb30 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
2fb40 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
2fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb60 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
2fb70 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
2fb80 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2fb90 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20  pPCache);.  }.. 
2fba0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2fbb0 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20  occurred above, 
2fbc0 66 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20  free the  Pager 
2fbd0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
2fbe0 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
2fbf0 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
2fc00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2fc10 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2fc20 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
2fc30 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
2fc40 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
2fc50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2fc60 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
2fc70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2fc80 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
2fc90 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
2fca0 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
2fcb0 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
2fcc0 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
2fcd0 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
2fce0 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
2fcf0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2fd00 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
2fd10 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
2fd20 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a  useJournal;.  /*
2fd30 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
2fd40 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
2fd50 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
2fd60 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2fd70 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
2fd80 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2fd90 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
2fda0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2fdb0 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
2fdc0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
2fdd0 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
2fde0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
2fdf0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
2fe00 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
2fe10 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2fe20 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
2fe30 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
2fe40 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2fe50 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38  ->tempFile = (u8
2fe60 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73  )tempFile;.  ass
2fe70 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
2fe80 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2fe90 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
2fea0 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
2feb0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2fec0 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
2fed0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2fee0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2fef0 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
2ff00 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2ff10 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  de = (u8)tempFil
2ff20 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  e; .  pPager->ch
2ff30 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2ff40 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2ff50 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
2ff60 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
2ff70 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
2ff80 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
2ff90 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  ;.  assert( useJ
2ffa0 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
2ffb0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
2ffc0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
2ffd0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2ffe0 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
2fff0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
30000 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
30010 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  ullSync==0 );.  
30020 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30030 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30 20 29  ->extraSync==0 )
30040 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
30050 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
30060 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
30070 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  ( pPager->walSyn
30080 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d  cFlags==0 );.  }
30090 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
300a0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a  ->fullSync = 1;.
300b0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72      pPager->extr
300c0 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  aSync = 0;.    p
300d0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
300e0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
300f0 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
30100 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
30110 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
30120 52 4d 41 4c 20 7c 20 28 53 51 4c 49 54 45 5f 53  RMAL | (SQLITE_S
30130 59 4e 43 5f 4e 4f 52 4d 41 4c 3c 3c 32 29 3b 0a  YNC_NORMAL<<2);.
30140 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
30150 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
30160 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
30170 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
30180 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
30190 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
301a0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
301b0 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70  (u16)nExtra;.  p
301c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
301d0 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
301e0 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
301f0 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
30200 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
30210 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d  ager->fd) || tem
30220 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65  pFile );.  setSe
30230 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
30240 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72  ;.  if( !useJour
30250 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  nal ){.    pPage
30260 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
30270 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
30280 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20  DE_OFF;.  }else 
30290 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20  if( memDb ){.   
302a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
302b0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
302c0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b  RNALMODE_MEMORY;
302d0 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
302e0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
302f0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
30300 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
30310 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Arg = 0; */.  pP
30320 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
30330 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 73 65 74  = xReinit;.  set
30340 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61  GetterMethod(pPa
30350 67 65 72 29 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65  ger);.  /* memse
30360 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
30370 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
30380 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
30390 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d   /* pPager->szMm
303a0 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ap = SQLITE_DEFA
303b0 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f  ULT_MMAP_SIZE //
303c0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20   will be set by 
303d0 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70  btree.c */..  *p
303e0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
303f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30400 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69  _OK;.}.../* Veri
30410 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61  fy that the data
30420 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
30430 74 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20  t be deleted or 
30440 72 65 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d  renamed out from
30450 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61  .** under the pa
30460 67 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ger.  Return SQL
30470 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61  ITE_OK if the da
30480 74 61 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20  tabase is still 
30490 77 65 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a  were it ought.**
304a0 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20   to be on disk. 
304b0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
304c0 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   (SQLITE_READONL
304d0 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d  Y_DBMOVED or som
304e0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  e other error.**
304f0 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74   code from sqlit
30500 65 33 4f 73 41 63 63 65 73 73 28 29 29 20 69 66  e3OsAccess()) if
30510 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
30520 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a  s gone missing..
30530 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61  */.static int da
30540 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28  tabaseIsUnmoved(
30550 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
30560 20 20 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20    int bHasMoved 
30570 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  = 0;.  int rc;..
30580 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
30590 6d 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  mpFile ) return 
305a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
305b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
305c0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
305d0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
305e0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
305f0 6d 65 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46  me && pPager->zF
30600 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20  ilename[0] );.  
30610 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
30620 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
30630 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
30640 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62  TL_HAS_MOVED, &b
30650 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28  HasMoved);.  if(
30660 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
30670 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OUND ){.    /* I
30680 66 20 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20  f the HAS_MOVED 
30690 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20  file-control is 
306a0 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61  unimplemented, a
306b0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66  ssume that the f
306c0 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ile.    ** has n
306d0 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20  ot been moved.  
306e0 54 68 61 74 20 69 73 20 74 68 65 20 68 69 73 74  That is the hist
306f0 6f 72 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20  orical behavior 
30700 6f 66 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72  of SQLite: prior
30710 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   to.    ** versi
30720 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76  on 3.8.3, it nev
30730 65 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  er checked */.  
30740 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30750 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
30760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
30770 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20  HasMoved ){.    
30780 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
30790 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20  ONLY_DBMOVED;.  
307a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
307b0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
307c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
307d0 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
307e0 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
307f0 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
30800 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
30810 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
30820 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
30830 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
30840 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
30850 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
30860 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
30870 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
30880 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
30890 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
308a0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
308b0 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
308c0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
308d0 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
308e0 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
308f0 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
30900 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
30910 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74  file exists in t
30920 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  he file system, 
30930 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72  and.**   * No pr
30940 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
30950 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
30960 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
30970 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
30980 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
30990 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
309a0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
309b0 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   0 bytes in size
309c0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
309d0 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
309e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
309f0 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
30a00 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t 0x00..**.** If
30a10 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
30a20 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
30a30 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
30a40 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
30a50 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
30a60 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
30a70 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
30a80 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
30a90 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
30aa0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
30ab0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
30ac0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
30ad0 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
30ae0 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
30af0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
30b00 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
30b10 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
30b20 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
30b30 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
30b40 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
30b50 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  is a master jour
30b60 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20  nal filename.** 
30b70 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
30b80 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
30b90 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61   is, and that ma
30ba0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
30bb0 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78  e.** does not ex
30bc0 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ist, then the jo
30bd0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
30be0 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e  t really hot. In
30bf0 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68   this.** case th
30c00 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
30c10 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70  return a false-p
30c20 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67  ositive. The pag
30c30 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a  er_playback().**
30c40 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
30c50 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20  scover that the 
30c60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30c70 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
30c80 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nd .** will not 
30c90 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a  roll it back. .*
30ca0 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
30cb0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
30cc0 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
30cd0 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
30ce0 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
30cf0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
30d00 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
30d10 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
30d20 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
30d30 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
30d40 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
30d50 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
30d60 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
30d70 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
30d80 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
30d90 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
30da0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
30db0 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
30dc0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
30dd0 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
30de0 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
30df0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
30e00 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
30e10 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
30e20 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
30e30 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
30e40 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
30e50 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
30e60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30e70 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  K;           /* 
30e80 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
30e90 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b   int exists = 1;
30ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30eb0 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
30ec0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
30ed0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e  ent */.  int jrn
30ee0 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e  lOpen = !!isOpen
30ef0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a  (pPager->jfd);..
30f00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30f10 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
30f20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
30f30 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
30f40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30f50 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30f60 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72  OPEN );..  asser
30f70 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c  t( jrnlOpen==0 |
30f80 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76  | ( sqlite3OsDev
30f90 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
30fa0 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  cs(pPager->jfd) 
30fb0 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43  &.    SQLITE_IOC
30fc0 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
30fd0 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a  HEN_OPEN.  ));..
30fe0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
30ff0 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
31000 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
31010 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
31020 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
31030 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
31040 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
31050 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
31060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
31070 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
31080 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20   locked = 0;    
31090 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
310a0 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
310b0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
310c0 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
310d0 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
310e0 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
310f0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
31100 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
31110 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
31120 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
31130 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
31140 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
31150 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
31160 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
31170 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
31180 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
31190 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
311a0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
311b0 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
311c0 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
311d0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
311e0 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
311f0 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
31200 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
31210 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
31220 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
31230 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
31240 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
31250 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
31260 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
31270 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
31280 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
31290 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
312a0 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
312b0 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
312c0 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
312d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
312e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
312f0 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
31300 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
31310 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
31320 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67  cked ){.      Pg
31330 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
31340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
31350 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
31360 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
31370 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
31380 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
31390 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
313a0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
313b0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
313c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
313d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
313e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
313f0 61 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20  atabase is zero 
31400 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  pages in size, t
31410 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65  hat means that e
31420 69 74 68 65 72 20 28 31 29 20 74 68 65 0a 20 20  ither (1) the.  
31430 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
31440 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72   is a remnant fr
31450 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61 62  om a prior datab
31460 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
31470 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20  e name where.   
31480 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
31490 62 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f  base file but no
314a0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  t the journal wa
314b0 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32  s deleted, or (2
314c0 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20  ) the initial.  
314d0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
314e0 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61  tion that popula
314f0 74 65 73 20 61 20 6e 65 77 20 64 61 74 61 62 61  tes a new databa
31500 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  se is being roll
31510 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ed back..       
31520 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61   ** In either ca
31530 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  se, the journal 
31540 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65  file can be dele
31550 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74  ted.  However, t
31560 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20 20  ake care.       
31570 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74   ** not to delet
31580 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
31590 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  le if it is alre
315a0 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a  ady open due to.
315b0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
315c0 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e  al_mode=PERSIST.
315d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
315e0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
315f0 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b   && !jrnlOpen ){
31600 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
31610 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
31620 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
31630 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
31640 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
31650 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
31660 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
31670 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
31680 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
31690 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
316a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
316b0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
316c0 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f  Mode ) pagerUnlo
316d0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
316e0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
316f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31700 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
31710 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
31720 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31730 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
31740 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
31750 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  nd no other conn
31760 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73  ection has a res
31770 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  erved.          
31780 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ** or greater lo
31790 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
317a0 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65  se file. Now che
317b0 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ck that there is
317c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74  .          ** at
317d0 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a   least one non-z
317e0 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
317f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
31800 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
31810 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72        ** If ther
31820 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f  e is, then we co
31830 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72  nsider this jour
31840 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49  nal to be hot. I
31850 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20  f not, .        
31860 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69    ** it can be i
31870 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20  gnored..        
31880 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
31890 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
318a0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
318b0 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
318c0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
318d0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
318e0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
318f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
31900 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
31910 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
31920 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
31930 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31940 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31960 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d        u8 first =
31970 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
31980 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
31990 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
319a0 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20  (void *)&first, 
319b0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
319c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
319d0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
319e0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
319f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31a00 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
31a10 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
31a20 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
31a30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
31a40 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
31a50 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31a70 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
31a80 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
31a90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
31aa0 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
31ab0 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
31ac0 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
31ad0 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
31ae0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
31af0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
31b00 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
31b10 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f  ** it has a zero
31b20 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
31b30 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
31b40 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
31b50 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
31b60 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
31b70 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
31b80 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
31b90 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
31ba0 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
31bb0 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
31bc0 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
31bd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
31be0 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
31bf0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
31c00 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
31c10 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
31c20 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
31c30 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
31c40 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
31c50 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
31c60 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
31c70 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
31c80 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
31c90 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
31ca0 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
31cb0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
31cc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
31cd0 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
31ce0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
31cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
31d00 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
31d10 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
31d20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31d30 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
31d40 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31d50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
31d60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31d70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
31d80 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
31d90 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
31da0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
31db0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
31dc0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
31dd0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
31de0 47 65 74 28 29 20 75 6e 74 69 6c 20 61 66 74 65  Get() until afte
31df0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
31e00 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
31e10 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
31e20 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
31e30 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
31e40 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
31e50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
31e60 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
31e70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
31e80 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
31e90 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
31ea0 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
31eb0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
31ec0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
31ed0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
31ee0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28  GER_OPEN state (
31ef0 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
31f00 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
31f10 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
31f20 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
31f30 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
31f40 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
31f50 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
31f60 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
31f70 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
31f80 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
31f90 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
31fa0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
31fb0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
31fc0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
31fd0 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
31fe0 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
31ff0 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
32000 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
32010 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
32020 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
32030 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
32040 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
32050 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
32060 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
32070 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
32080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
32090 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
320a0 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
320b0 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
320c0 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
320d0 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
320e0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
320f0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
32100 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
32110 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
32120 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
32130 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
32140 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
32150 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
32160 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
32170 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
32180 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
32190 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
321a0 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
321b0 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
321c0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
321d0 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
321e0 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
321f0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
32200 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
32210 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
32220 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
32230 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
32240 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
32250 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
32260 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
32270 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
32280 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
32290 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69  ile or .** rolli
322a0 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
322b0 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
322c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
322d0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
322e0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
322f0 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
32300 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
32310 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
32320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
32330 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
32340 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
32350 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
32360 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
32370 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
32380 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
32390 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  nding pages. Thi
323a0 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
323b0 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73  he pager state s
323c0 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a  hould either.  *
323d0 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41  * be OPEN or REA
323e0 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f  DER. READER is o
323f0 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
32400 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20  the pager is or 
32410 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63  was in .  ** exc
32420 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
32430 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  de.  */.  assert
32440 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
32450 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
32460 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
32470 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
32480 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
32490 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
324a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
324b0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
324c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
324d0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
324e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
324f0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
32500 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  _OK );..  if( !p
32510 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
32520 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
32530 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32540 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
32550 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
32560 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
32570 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
32580 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
32590 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
325a0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
325b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
325c0 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
325d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
325e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
325f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
32600 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
32610 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
32620 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
32630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32640 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32650 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
32660 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
32670 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
32680 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  ;.      goto fai
32690 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
326a0 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
326b0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
326c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
326d0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
326e0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
326f0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
32700 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
32710 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
32720 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
32730 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
32740 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
32750 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
32760 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
32770 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
32780 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
32790 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
327a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
327b0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
327c0 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
327d0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
327e0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
327f0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
32800 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
32810 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  Y_ROLLBACK;.    
32820 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32830 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32840 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
32850 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
32860 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
32870 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
32880 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
32890 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
328a0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
328b0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
328c0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
328d0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
328e0 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
328f0 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
32900 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
32910 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
32920 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
32930 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
32940 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
32950 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
32960 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
32970 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
32980 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
32990 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
329a0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
329b0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
329c0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
329d0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
329e0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
329f0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
32a00 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
32a10 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
32a20 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
32a30 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
32a40 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
32a50 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
32a60 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
32a70 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
32a80 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
32a90 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
32aa0 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
32ab0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32ac0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
32ad0 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
32ae0 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
32af0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
32b00 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
32b10 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
32b20 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
32b30 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
32b40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
32b50 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
32b60 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32b70 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
32b80 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
32b90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32ba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32bb0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
32bc0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
32bd0 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
32be0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
32bf0 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
32c00 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
32c10 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
32c20 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
32c30 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
32c40 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
32c50 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
32c60 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
32c70 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
32c80 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
32c90 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
32ca0 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
32cb0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
32cc0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
32cd0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
32ce0 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
32cf0 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
32d00 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
32d10 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
32d20 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
32d30 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
32d40 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
32d50 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
32d60 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
32d70 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
32d80 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
32d90 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
32da0 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
32db0 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
32dc0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
32dd0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
32de0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
32df0 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
32e00 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
32e10 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
32e20 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
32e30 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
32e40 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
32e50 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
32e60 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
32e70 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
32e80 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
32e90 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
32ea0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
32eb0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
32ec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
32ed0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
32ee0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
32ef0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
32f00 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
32f10 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
32f20 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
32f30 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
32f40 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
32f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32f60 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
32f70 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
32f80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32f90 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
32fa0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
32fb0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
32fc0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
32fd0 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
32fe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
32ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
33000 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
33010 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
33020 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
33030 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
33040 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
33050 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
33060 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
33070 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
33080 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
33090 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
330a0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
330b0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
330c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
330d0 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
330e0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
330f0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
33100 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
33110 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
33120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33130 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
33140 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
33150 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
33160 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
33170 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
33180 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
33190 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
331a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
331b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20   }.      }. .   
331c0 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
331d0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
331e0 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
331f0 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
33200 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
33210 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
33220 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
33230 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
33240 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
33250 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
33260 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
33270 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
33280 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
33290 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
332a0 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
332b0 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
332c0 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
332d0 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
332e0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
332f0 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
33300 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
33310 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
33320 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
33330 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
33340 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
33350 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
33360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
33370 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
33380 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
33390 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
333a0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
333b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
333c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
333d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
333e0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
333f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
33400 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33410 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
33420 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
33430 62 61 63 6b 28 70 50 61 67 65 72 2c 20 21 70 50  back(pPager, !pP
33440 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
33450 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
33460 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
33470 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  R_OPEN;.        
33480 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
33490 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
334a0 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
334b0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
334c0 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
334d0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
334e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
334f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33500 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
33510 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
33520 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
33530 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f  hile trying to o
33540 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
33550 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f  r roll back a ho
33560 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20  t-journal while 
33570 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
33580 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
33590 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
335a0 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  unlock() routine
335b0 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
335c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
335d0 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20   to unlock.     
335e0 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20     ** the file. 
335f0 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74  If the unlock at
33600 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65  tempt fails, the
33610 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75  n Pager.eLock mu
33620 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
33630 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
33640 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f  LOCK (see the co
33650 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
33660 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20  #define for .   
33670 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f       ** UNKNOWN_
33680 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61  LOCK above for a
33690 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20  n explanation). 
336a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
336b0 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
336c0 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c  to get pager_unl
336d0 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73  ock() to do this
336e0 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61  , set Pager.eSta
336f0 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  te to.        **
33700 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77   PAGER_ERROR now
33710 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
33720 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61  tually counted a
33730 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20  s a transition. 
33740 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52         ** to ERR
33750 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20  OR state in the 
33760 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74  state diagram at
33770 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
33780 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a   file,.        *
33790 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
337a0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61  that the same ca
337b0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
337c0 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20  ck() will very. 
337d0 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c         ** shortl
337e0 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65  y transition the
337f0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   pager object to
33800 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
33810 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   Calling.       
33820 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72   ** assert_pager
33830 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66  _state() would f
33840 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73  ail now, as it s
33850 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73  hould not be pos
33860 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
33870 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20   to be in ERROR 
33880 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65  state when there
33890 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61   are zero outsta
338a0 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20  nding page .    
338b0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
338c0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
338d0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
338e0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
338f0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
33900 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
33910 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33920 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
33930 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61  _OPEN );.      a
33940 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
33950 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
33960 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
33970 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
33980 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
33990 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
339a0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
339b0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
339c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
339d0 20 26 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48   && pPager->hasH
339e0 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b  eldSharedLock ){
339f0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
33a00 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
33a10 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
33a20 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20   then check to. 
33a30 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74       ** see if t
33a40 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
33a50 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
33a60 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
33a70 68 61 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20  has changed,.   
33a80 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20     ** flush the 
33a90 63 61 63 68 65 2e 20 20 54 68 65 20 68 61 73 48  cache.  The hasH
33aa0 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c  eldSharedLock fl
33ab0 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 69 73  ag prevents this
33ac0 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f   from.      ** o
33ad0 63 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20  ccurring on the 
33ae0 76 65 72 79 20 66 69 72 73 74 20 61 63 63 65 73  very first acces
33af0 73 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20  s to a file, in 
33b00 6f 72 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a  order to save a.
33b10 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
33b20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69  unnecessary sqli
33b30 74 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c  te3OsRead() call
33b40 20 61 74 20 74 68 65 20 73 74 61 72 74 2d 75 70   at the start-up
33b50 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
33b60 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
33b70 6e 67 65 73 20 61 72 65 20 64 65 74 65 63 74 65  nges are detecte
33b80 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
33b90 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
33ba0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
33bb0 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
33bc0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
33bd0 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
33be0 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
33bf0 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
33c00 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
33c10 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
33c20 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
33c30 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
33c40 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
33c50 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
33c60 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
33c70 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
33c80 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
33c90 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
33ca0 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
33cb0 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
33cc0 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
33cd0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
33ce0 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
33cf0 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
33d00 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
33d10 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
33d20 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
33d30 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
33d40 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
33d50 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
33d60 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
33d70 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
33d80 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
33d90 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
33da0 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
33db0 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
33dc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33dd0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
33de0 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
33df0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
33e00 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
33e10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33e20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
33e30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
33e40 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
33e50 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
33e60 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
33e70 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  }.        memset
33e80 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
33e90 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
33ea0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
33eb0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
33ec0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
33ed0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
33ee0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
33ef0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
33f00 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
33f10 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ger);..        /
33f20 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61  * Unmap the data
33f30 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73  base file. It is
33f40 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65   possible that e
33f50 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65  xternal processe
33f60 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79  s.        ** may
33f70 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64 20   have truncated 
33f80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33f90 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e  e and then exten
33fa0 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20  ded it back.    
33fb0 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72      ** to its or
33fc0 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c  iginal size whil
33fd0 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 77  e this process w
33fe0 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61  as not holding a
33ff0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
34000 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
34010 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20 61  here may exist a
34020 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70   Pager.pMap mapp
34030 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73  ing that appears
34040 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
34050 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  e the right size
34060 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75   but is not actu
34070 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69  ally valid. Avoi
34080 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  d this.        *
34090 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79  * possibility by
340a0 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64   unmapping the d
340b0 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  b here. */.     
340c0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
340d0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
340e0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
340f0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
34100 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
34110 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
34120 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
34130 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20  e is a WAL file 
34140 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
34150 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61  em, open this da
34160 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20  tabase in WAL.  
34170 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72    ** mode. Other
34180 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  wise, the follow
34190 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ing function cal
341a0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
341b0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
341c0 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
341d0 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66  ent(pPager);.#if
341e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
341f0 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28  _WAL.    assert(
34200 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30   pPager->pWal==0
34210 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
34220 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  K );.#endif.  }.
34230 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
34240 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
34250 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
34260 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
34270 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65  c = pagerBeginRe
34280 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
34290 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
342a0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
342b0 6c 65 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  le==0 && pPager-
342c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
342d0 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  PEN && rc==SQLIT
342e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
342f0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
34300 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
34310 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
34320 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
34330 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34340 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
34350 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75  B );.    pager_u
34360 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
34370 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34380 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
34390 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65  _OPEN );.  }else
343a0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  {.    pPager->eS
343b0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
343c0 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  DER;.    pPager-
343d0 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
343e0 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ck = 1;.  }.  re
343f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
34400 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
34410 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
34420 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
34430 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
34440 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
34450 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
34460 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
34470 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
34480 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
34490 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
344a0 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
344b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
344c0 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
344d0 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
344e0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
344f0 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
34500 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
34510 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
34520 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
34530 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
34540 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
34550 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
34560 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20 28  nMmapOut==0 && (
34570 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
34580 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
34590 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20  Cache)==0) ){.  
345a0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
345b0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
345c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
345d0 68 65 20 70 61 67 65 20 67 65 74 74 65 72 20 6d  he page getter m
345e0 65 74 68 6f 64 73 20 65 61 63 68 20 74 72 79 20  ethods each try 
345f0 74 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 66  to acquire a ref
34600 65 72 65 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 70  erence to a.** p
34610 61 67 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  age with page nu
34620 6d 62 65 72 20 70 67 6e 6f 2e 20 49 66 20 74 68  mber pgno. If th
34630 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65  e requested refe
34640 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63  rence is .** suc
34650 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
34660 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64  ed, it is copied
34670 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20   to *ppPage and 
34680 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
34690 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ed..**.** There 
346a0 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 69 6d  are different im
346b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
346c0 20 74 68 65 20 67 65 74 74 65 72 20 6d 65 74 68   the getter meth
346d0 6f 64 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20  od depending.** 
346e0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  on the current s
346f0 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
34700 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 67 65 74  r..**.**     get
34710 50 61 67 65 4e 6f 72 6d 61 6c 28 29 20 20 20 20  PageNormal()    
34720 20 20 20 20 20 2d 2d 20 20 54 68 65 20 6e 6f 72       --  The nor
34730 6d 61 6c 20 67 65 74 74 65 72 0a 2a 2a 20 20 20  mal getter.**   
34740 20 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 29    getPageError()
34750 20 20 20 20 20 20 20 20 20 20 2d 2d 20 20 55 73            --  Us
34760 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
34770 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  is in an error s
34780 74 61 74 65 0a 2a 2a 20 20 20 20 20 67 65 74 50  tate.**     getP
34790 61 67 65 4d 6d 61 70 28 29 20 20 20 20 20 20 20  ageMmap()       
347a0 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66 20      --  Used if 
347b0 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f  memory-mapped I/
347c0 4f 20 69 73 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a  O is enabled.**.
347d0 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
347e0 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
347f0 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
34800 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
34810 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
34820 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
34830 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
34840 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
34850 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
34860 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
34870 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
34880 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
34890 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
348a0 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
348b0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
348c0 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
348d0 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
348e0 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
348f0 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
34900 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
34910 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
34920 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
34930 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
34940 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
34950 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
34960 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
34970 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
34980 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
34990 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
349a0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
349b0 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
349c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
349d0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
349e0 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
349f0 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
34a00 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
34a10 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
34a20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
34a30 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
34a40 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
34a50 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
34a60 20 6f 72 20 69 66 20 0a 2a 2a 20 74 68 65 20 66   or if .** the f
34a70 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63  lags parameter c
34a80 6f 6e 74 61 69 6e 73 20 74 68 65 20 50 41 47 45  ontains the PAGE
34a90 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
34aa0 62 69 74 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  bit and the .** 
34ab0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
34ac0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
34ad0 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
34ae0 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
34af0 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
34b00 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
34b10 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
34b20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
34b30 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
34b40 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
34b50 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47  s. .**.** If PAG
34b60 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
34b70 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
34b80 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
34b90 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20  t care about.** 
34ba0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
34bb0 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
34bc0 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65  ccurs in two sce
34bd0 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
34be0 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
34bf0 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
34c00 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
34c10 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
34c20 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
34c30 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
34c40 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
34c50 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
34c60 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
34c70 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
34c80 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  che to be filled
34c90 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72   with the data r
34ca0 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
34cb0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a   the savepoint j
34cc0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
34cd0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
34ce0 54 45 4e 54 20 69 73 20 74 72 75 65 2c 20 74 68  TENT is true, th
34cf0 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75  en the data retu
34d00 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69  rned is zeroed i
34d10 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69  nstead.** of bei
34d20 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ng read from the
34d30 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
34d40 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74  ionally, the bit
34d50 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  s corresponding.
34d60 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61  ** to pgno in Pa
34d70 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28  ger.pInJournal (
34d80 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  bitvec of pages 
34d90 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20  already written 
34da0 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  to the.** journa
34db0 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
34dc0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
34dd0 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
34de0 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a  ecs of any open.
34df0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ** savepoints ar
34e00 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e  e set. This mean
34e10 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  s if the page is
34e20 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61   made writable a
34e30 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69  t any.** point i
34e40 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73  n the future, us
34e50 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ing a call to sq
34e60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34e70 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ), its contents.
34e80 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a  ** will not be j
34e90 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73  ournaled. This s
34ea0 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54  aves IO..**.** T
34eb0 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
34ec0 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
34ed0 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
34ee0 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
34ef0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
34f00 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
34f10 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
34f20 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
34f30 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
34f40 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  o sqlite3PagerLo
34f50 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
34f60 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c  is routine and L
34f70 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
34f80 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
34f90 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
34fa0 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
34fb0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
34fc0 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
34fd0 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
34fe0 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
34ff0 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
35000 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70  n whereas Lookup
35010 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
35020 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
35030 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
35040 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
35050 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
35060 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
35070 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
35080 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
35090 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
350a0 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c  sary..** Since L
350b0 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
350c0 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
350d0 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
350e0 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
350f0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
35100 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
35110 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 0a 20 20  etPageNormal(.  
35120 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
35130 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
35140 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
35150 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
35160 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
35170 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
35180 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
35190 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
351a0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
351b0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
351c0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
351d0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
351e0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
351f0 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
35200 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
35210 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  _OK;.  PgHdr *pP
35220 67 3b 0a 20 20 75 38 20 6e 6f 43 6f 6e 74 65 6e  g;.  u8 noConten
35230 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
35240 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
35250 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
35260 45 4e 54 20 69 73 20 73 65 74 20 2a 2f 0a 20 20  ENT is set */.  
35270 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70  sqlite3_pcache_p
35280 61 67 65 20 2a 70 42 61 73 65 3b 0a 0a 20 20 61  age *pBase;..  a
35290 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
352a0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
352b0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
352c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
352d0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
352e0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
352f0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
35300 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
35310 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
35320 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b  SharedLock==1 );
35330 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
35340 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
35350 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
35360 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74   an CONCURRENT t
35370 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74  ransaction and t
35380 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 72 65  he page being re
35390 61 64 20 77 61 73 0a 20 20 2a 2a 20 70 72 65 73  ad was.  ** pres
353a0 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
353b0 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
353c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
353d0 73 20 6f 70 65 6e 65 64 2c 0a 20 20 2a 2a 20 6d  s opened,.  ** m
353e0 61 72 6b 20 69 74 20 61 73 20 72 65 61 64 20 69  ark it as read i
353f0 6e 20 74 68 65 20 70 41 6c 6c 52 65 61 64 20 76  n the pAllRead v
35400 65 63 74 6f 72 2e 20 20 2a 2f 0a 20 20 70 50 67  ector.  */.  pPg
35410 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
35420 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 26 26 20  er->pAllRead && 
35430 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
35440 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
35450 50 41 47 45 52 54 52 41 43 45 28 28 22 55 53 49  PAGERTRACE(("USI
35460 4e 47 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  NG page %d\n", p
35470 67 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  gno));.    rc = 
35480 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
35490 28 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61  (pPager->pAllRea
354a0 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  d, pgno);.    if
354b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
354c0 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
354d0 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 23 65  uire_err;.  }.#e
354e0 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 67 6e 6f  ndif..  if( pgno
354f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
35500 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35510 3b 0a 20 20 70 42 61 73 65 20 3d 20 73 71 6c 69  ;.  pBase = sqli
35520 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
35530 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
35540 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 69 66 28 20  pgno, 3);.  if( 
35550 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pBase==0 ){.    
35560 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  pPg = 0;.    rc 
35570 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
35580 65 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65  etchStress(pPage
35590 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
355a0 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 69  , &pBase);.    i
355b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
355c0 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
355d0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 69  quire_err;.    i
355e0 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20  f( pBase==0 ){. 
355f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
35600 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
35610 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
35620 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
35630 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 2a 70 70  .  }.  pPg = *pp
35640 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Page = sqlite3Pc
35650 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28  acheFetchFinish(
35660 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
35670 20 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20   pgno, pBase);. 
35680 20 61 73 73 65 72 74 28 20 70 50 67 3d 3d 28 2a   assert( pPg==(*
35690 70 70 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  ppPage) );.  ass
356a0 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  ert( pPg->pgno==
356b0 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
356c0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
356d0 50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50  Pager || pPg->pP
356e0 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 6e 6f  ager==0 );..  no
356f0 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73  Content = (flags
35700 20 26 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43   & PAGER_GET_NOC
35710 4f 4e 54 45 4e 54 29 21 3d 30 3b 0a 20 20 69 66  ONTENT)!=0;.  if
35720 28 20 70 50 67 2d 3e 70 50 61 67 65 72 20 26 26  ( pPg->pPager &&
35730 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
35740 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
35750 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
35760 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
35770 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
35780 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
35790 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
357a0 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
357b0 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
357c0 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
357d0 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
357e0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
357f0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50  Pager) );.    pP
35800 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
35810 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20  R_STAT_HIT]++;. 
35820 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35830 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
35840 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
35850 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
35860 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
35870 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
35880 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
35890 69 74 69 61 6c 69 7a 65 64 2e 20 42 75 74 20 66  itialized. But f
358a0 69 72 73 74 20 73 6f 6d 65 20 65 72 72 6f 72 20  irst some error 
358b0 63 68 65 63 6b 73 3a 0a 20 20 20 20 2a 2a 0a 20  checks:.    **. 
358c0 20 20 20 2a 2a 20 28 31 29 20 54 68 65 20 6d 61     ** (1) The ma
358d0 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
358e0 72 20 69 73 20 32 5e 33 31 0a 20 20 20 20 2a 2a  r is 2^31.    **
358f0 20 28 32 29 20 4e 65 76 65 72 20 74 72 79 20 74   (2) Never try t
35900 6f 20 66 65 74 63 68 20 74 68 65 20 6c 6f 63 6b  o fetch the lock
35910 69 6e 67 20 70 61 67 65 0a 20 20 20 20 2a 2f 0a  ing page.    */.
35920 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47      if( pgno>PAG
35930 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
35940 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
35950 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
35960 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
35970 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
35980 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
35990 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
359a0 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  }..    pPg->pPag
359b0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
359c0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
359d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
359e0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 69   !MEMDB );.    i
359f0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
35a00 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
35a10 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c  ->dbSize<pgno ||
35a20 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
35a30 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
35a40 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
35a50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35a60 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
35a70 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
35a80 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
35a90 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
35aa0 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
35ab0 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
35ac0 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
35ad0 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
35ae0 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
35af0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
35b00 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
35b10 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
35b20 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
35b30 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
35b40 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
35b50 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
35b60 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
35b70 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
35b80 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
35b90 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
35ba0 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
35bb0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
35bc0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
35bd0 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
35be0 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
35bf0 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
35c00 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
35c10 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
35c20 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
35c30 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
35c40 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
35c50 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
35c60 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
35c70 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
35c80 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
35c90 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
35ca0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
35cb0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
35cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35cd0 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
35ce0 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
35cf0 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
35d00 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
35d10 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
35d20 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
35d30 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
35d40 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
35d50 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
35d60 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
35d70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
35d80 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
35d90 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
35da0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
35db0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
35dc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
35dd0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
35de0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
35df0 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
35e00 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20  AT_MISS]++;.    
35e10 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
35e20 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  e(pPg);.      if
35e30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35e40 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
35e50 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35e60 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
35e70 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
35e80 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20  agehash(pPg);.  
35e90 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
35ea0 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71  E_OK;..pager_acq
35eb0 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65  uire_err:.  asse
35ec0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
35ed0 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  K );.  if( pPg )
35ee0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
35ef0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
35f00 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
35f10 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
35f20 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
35f30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35f40 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
35f50 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 54 68  MAP_SIZE>0./* Th
35f60 65 20 70 61 67 65 20 67 65 74 74 65 72 20 66 6f  e page getter fo
35f70 72 20 77 68 65 6e 20 6d 65 6d 6f 72 79 2d 6d 61  r when memory-ma
35f80 70 70 65 64 20 49 2f 4f 20 69 73 20 65 6e 61 62  pped I/O is enab
35f90 6c 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  led */.static in
35fa0 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28 0a 20  t getPageMMap(. 
35fb0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
35fc0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
35fd0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
35fe0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
35ff0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
36000 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
36010 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
36020 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
36030 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
36040 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
36050 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
36060 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
36070 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
36080 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  XXX flags */.){.
36090 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
360a0 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
360b0 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46  Pg = 0;.  u32 iF
360c0 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rame = 0;       
360d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61            /* Fra
360e0 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  me to read from 
360f0 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  WAL file */..  /
36100 2a 20 49 74 20 69 73 20 61 63 63 65 70 74 61 62  * It is acceptab
36110 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65 61 64  le to use a read
36120 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67  -only (mmap) pag
36130 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65  e for any page e
36140 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20  xcept.  ** page 
36150 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  1 if there is no
36160 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
36170 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41  on open or the A
36180 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a  CQUIRE_READONLY.
36190 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70    ** flag was sp
361a0 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 63  ecified by the c
361b0 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f  aller. And so lo
361c0 6e 67 20 61 73 20 74 68 65 20 64 62 20 69 73 20  ng as the db is 
361d0 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70  not a .  ** temp
361e0 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f  orary or in-memo
361f0 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  ry database.  */
36200 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d  .  const int bMm
36210 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31 0a 20  apOk = (pgno>1. 
36220 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
36230 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
36240 45 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50  ER || (flags & P
36250 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
36260 59 29 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  Y)).  );..  asse
36270 72 74 28 20 55 53 45 46 45 54 43 48 28 70 50 61  rt( USEFETCH(pPa
36280 67 65 72 29 20 29 3b 0a 23 69 66 64 65 66 20 53  ger) );.#ifdef S
36290 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
362a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
362b0 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 3b 0a 23  ->xCodec==0 );.#
362c0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 70 74 69  endif..  /* Opti
362d0 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  mization note:  
362e0 41 64 64 69 6e 67 20 74 68 65 20 22 70 67 6e 6f  Adding the "pgno
362f0 3c 3d 31 22 20 74 65 72 6d 20 62 65 66 6f 72 65  <=1" term before
36300 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65 0a   "pgno==0" here.
36310 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20    ** allows the 
36320 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
36330 65 72 20 74 6f 20 72 65 75 73 65 20 74 68 65 20  er to reuse the 
36340 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 22  results of the "
36350 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65 73  pgno>1".  ** tes
36360 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
36370 73 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64  s statement, and
36380 20 61 76 6f 69 64 20 74 65 73 74 69 6e 67 20 70   avoid testing p
36390 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20 20  gno==0 in the.  
363a0 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  ** common case w
363b0 68 65 72 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  here pgno is lar
363c0 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ge. */.  if( pgn
363d0 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30 20  o<=1 && pgno==0 
363e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
363f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
36400 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
36410 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
36420 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
36430 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
36440 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
36450 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
36460 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65  t( pPager->hasHe
36470 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20  ldSharedLock==1 
36480 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36490 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
364a0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66  LITE_OK );..  if
364b0 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67  ( bMmapOk && pag
364c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
364d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
364e0 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
364f0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
36500 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20  gno, &iFrame);. 
36510 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
36530 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
36540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36550 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62 4d 6d 61  }.  }.  if( bMma
36560 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30  pOk && iFrame==0
36570 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
36580 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ata = 0;.    rc 
36590 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68  = sqlite3OsFetch
365a0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20  (pPager->fd, .  
365b0 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f        (i64)(pgno
365c0 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
365d0 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e  geSize, pPager->
365e0 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61  pageSize, &pData
365f0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
36600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
36610 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
36620 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
36630 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20  te>PAGER_READER 
36640 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
36650 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ile ){.        p
36660 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
36670 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
36680 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
36690 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
366a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
366b0 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
366c0 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  age(pPager, pgno
366d0 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a  , pData, &pPg);.
366e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
366f0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
36700 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
36710 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70   (i64)(pgno-1)*p
36720 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
36730 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d   pData);.      }
36740 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 20 29  .      if( pPg )
36750 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
36760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36770 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
36780 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ge = pPg;.      
36790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
367a0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
367b0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
367c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
367d0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
367e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
367f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
36800 6e 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28  n getPageNormal(
36810 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70  pPager, pgno, pp
36820 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a  Page, flags);.}.
36830 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
36840 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
36850 20 2a 2f 0a 0a 2f 2a 20 54 68 65 20 70 61 67 65   */../* The page
36860 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 66   getter method f
36870 6f 72 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  or when the page
36880 72 20 69 73 20 61 6e 20 65 72 72 6f 72 20 73 74  r is an error st
36890 61 74 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ate */.static in
368a0 74 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 0a  t getPageError(.
368b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
368c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
368d0 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
368e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
368f0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
36900 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
36910 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
36920 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
36930 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
36940 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
36950 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
36960 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
36970 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
36980 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  _XXX flags */.){
36990 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
369a0 54 45 52 28 70 67 6e 6f 29 3b 0a 20 20 55 4e 55  TER(pgno);.  UNU
369b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c  SED_PARAMETER(fl
369c0 61 67 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ags);.  assert( 
369d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
369e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
369f0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  *ppPage = 0;.  r
36a00 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
36a10 72 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69  rCode;.}.../* Di
36a20 73 70 61 74 63 68 20 61 6c 6c 20 70 61 67 65 20  spatch all page 
36a30 66 65 74 63 68 20 72 65 71 75 65 73 74 73 20 74  fetch requests t
36a40 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
36a50 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 2e  e getter method.
36a60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
36a70 61 67 65 72 47 65 74 28 0a 20 20 50 61 67 65 72  agerGet(.  Pager
36a80 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
36a90 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
36aa0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36ab0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
36ac0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
36ad0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
36ae0 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
36af0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
36b00 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
36b10 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
36b20 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
36b30 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
36b40 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
36b50 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  ags */.){.  retu
36b60 72 6e 20 70 50 61 67 65 72 2d 3e 78 47 65 74 28  rn pPager->xGet(
36b70 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70  pPager, pgno, pp
36b80 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a  Page, flags);.}.
36b90 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
36ba0 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
36bb0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
36bc0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
36bd0 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
36be0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
36bf0 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
36c00 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
36c10 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
36c20 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
36c30 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65  cache. .**.** Se
36c40 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
36c50 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
36c60 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
36c70 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
36c80 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
36c90 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
36ca0 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
36cb0 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
36cc0 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
36cd0 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
36ce0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
36cf0 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
36d00 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
36d10 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
36d20 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
36d30 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
36d40 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
36d50 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
36d60 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
36d70 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
36d80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
36d90 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74  o pgno){.  sqlit
36da0 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
36db0 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
36dc0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
36dd0 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
36de0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36df0 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20  ger->pPCache!=0 
36e00 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71 6c  );.  pPage = sql
36e10 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
36e20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
36e30 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61 73 73   pgno, 0);.  ass
36e40 65 72 74 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c  ert( pPage==0 ||
36e50 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
36e60 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b 0a 20 20  SharedLock );.  
36e70 69 66 28 20 70 50 61 67 65 3d 3d 30 20 29 20 72  if( pPage==0 ) r
36e80 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
36e90 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  n sqlite3PcacheF
36ea0 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65  etchFinish(pPage
36eb0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
36ec0 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pPage);.}../*.
36ed0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
36ee0 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a  e reference..**.
36ef0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
36f00 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
36f10 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
36f20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
36f30 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
36f40 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
36f50 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
36f60 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
36f70 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
36f80 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
36f90 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
36fa0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
36fb0 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
36fc0 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
36fd0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
36fe0 74 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70 50  tNull(DbPage *pP
36ff0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
37000 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
37010 50 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  Pg!=0 );.  pPage
37020 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
37030 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67  .  if( pPg->flag
37040 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29  s & PGHDR_MMAP )
37050 7b 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65 61  {.    pagerRelea
37060 73 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b 0a  seMapPage(pPg);.
37070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
37080 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
37090 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  e(pPg);.  }.  pa
370a0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
370b0 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69  d(pPager);.}.voi
370c0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
370d0 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
370e0 7b 0a 20 20 69 66 28 20 70 50 67 20 29 20 73 71  {.  if( pPg ) sq
370f0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
37100 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a  otNull(pPg);.}..
37110 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
37120 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
37130 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
37140 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
37150 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
37160 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
37170 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
37180 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
37190 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
371a0 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
371b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
371c0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
371d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
371e0 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
371f0 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
37200 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
37210 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
37220 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
37230 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
37240 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
37250 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
37260 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
37270 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
37280 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
37290 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
372a0 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
372b0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
372c0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
372d0 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
372e0 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
372f0 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
37300 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
37310 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
37320 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37330 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
37340 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
37350 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
37360 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
37370 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
37380 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
37390 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
373a0 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
373b0 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
373c0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
373d0 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
373e0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
373f0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
37400 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
37410 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
37420 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
37430 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
37440 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
37450 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
37460 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
37470 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
37480 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
37490 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
374a0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
374b0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
374c0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
374d0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
374e0 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
374f0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
37500 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
37510 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
37520 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
37530 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
37540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37560 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
37570 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
37580 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
37590 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
375a0 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
375b0 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
375c0 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
375d0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
375e0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
375f0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
37600 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
37610 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
37620 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37630 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
37640 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
37650 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
37660 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73  rror state, this
37670 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
37680 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20  o-op.  But on.  
37690 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  ** the other han
376a0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
376b0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
376c0 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
376d0 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  y in.  ** an err
376e0 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
376f0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
37700 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
37710 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
37720 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65  de;..  if( !page
37730 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
37740 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
37750 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
37760 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
37770 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
37780 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
37790 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
377a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
377b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
377c0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
377d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
377e0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
377f0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
37800 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
37810 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e   file if it is n
37820 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
37830 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f   */.    if( !isO
37840 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
37850 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
37860 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
37870 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
37880 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
37890 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65         sqlite3Me
378a0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
378b0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
378c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
378d0 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  int flags = SQLI
378e0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
378f0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
37900 45 41 54 45 3b 0a 20 20 20 20 20 20 20 20 69 6e  EATE;.        in
37910 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20 20 20 20 20  t nSpill;..     
37920 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74     if( pPager->t
37930 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
37940 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53       flags |= (S
37950 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
37960 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
37970 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
37980 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53  L);.          nS
37990 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f  pill = sqlite3Co
379a0 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b  nfig.nStmtSpill;
379b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
379c0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
379d0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  |= SQLITE_OPEN_M
379e0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
379f0 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20         nSpill = 
37a00 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
37a10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
37a20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  }.          .   
37a30 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
37a40 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
37a50 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73   still has the s
37a60 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64  ame name as it d
37a70 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  id when.        
37a80 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e  ** it was origin
37a90 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  ally opened. */.
37aa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 64 61 74          rc = dat
37ab0 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70  abaseIsUnmoved(p
37ac0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
37ad0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37ae0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
37af0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
37b00 61 6c 4f 70 65 6e 20 28 0a 20 20 20 20 20 20 20  alOpen (.       
37b10 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
37b20 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
37b30 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
37b40 73 2c 20 6e 53 70 69 6c 6c 0a 20 20 20 20 20 20  s, nSpill.      
37b50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
37b60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
37b70 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
37b80 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
37b90 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
37ba0 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f     }.  .  .    /
37bb0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
37bc0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
37bd0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
37be0 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
37bf0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
37c00 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
37c10 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
37c20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37c30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   ){.      /* TOD
37c40 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20  O: Check if all 
37c50 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61  of these are rea
37c60 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  lly required. */
37c70 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
37c80 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Rec = 0;.      p
37c90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37ca0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
37cb0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
37cc0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
37cd0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
37ce0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
37cf0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
37d00 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
37d10 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
37d20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
37d30 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
37d40 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
37d50 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
37d60 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
37d70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
37d80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37d90 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37da0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
37db0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
37dc0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
37dd0 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20  CACHEMOD;.  }.. 
37de0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37df0 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69  *.** Begin a wri
37e00 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
37e10 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
37e20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
37e30 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61   a .** write-tra
37e40 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
37e50 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
37e60 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
37e70 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
37e80 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  * If the exFlag 
37e90 61 72 67 75 6d 65 6e 74 20 69 73 20 30 2c 20 74  argument is 0, t
37ea0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
37eb0 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
37ec0 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
37ed0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
37ee0 20 65 78 46 6c 61 67 20 69 73 20 3e 30 2c 20 74   exFlag is >0, t
37ef0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
37f00 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
37f10 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
37f20 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
37f30 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
37f40 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
37f50 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
37f60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 28 65 78  ed..**.** If (ex
37f70 46 6c 61 67 3c 30 29 20 61 6e 64 20 74 68 65 20  Flag<0) and the 
37f80 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 57  database is in W
37f90 41 4c 20 6d 6f 64 65 2c 20 64 6f 20 6e 6f 74 20  AL mode, do not 
37fa0 74 61 6b 65 20 61 6e 79 20 6c 6f 63 6b 73 2e 0a  take any locks..
37fb0 2a 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  ** The transacti
37fc0 6f 6e 20 77 69 6c 6c 20 72 75 6e 20 69 6e 20 43  on will run in C
37fd0 4f 4e 43 55 52 52 45 4e 54 20 6d 6f 64 65 20 69  ONCURRENT mode i
37fe0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
37ff0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
38000 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  y argument is no
38010 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
38020 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65   sub-journal ope
38030 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
38040 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  is transaction w
38050 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ill be opened as
38060 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
38070 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  le. This.** has 
38080 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65  no effect if the
38090 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
380a0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28  already opened (
380b0 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65  as it may be whe
380c0 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20  n.** running in 
380d0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20  exclusive mode) 
380e0 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  or if the transa
380f0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
38100 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d  equire a.** sub-
38110 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20  journal. If the 
38120 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
38130 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74  ument is zero, t
38140 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
38150 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
38160 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  is implemented i
38170 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67  n-memory if pPag
38180 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  er is an in-memo
38190 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a  ry database, .**
381a0 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70   or using a temp
381b0 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72  orary file other
381c0 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
381d0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50  ite3PagerBegin(P
381e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
381f0 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75  t exFlag, int su
38200 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69  bjInMemory){.  i
38210 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
38220 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
38230 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
38240 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
38250 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  de;.  assert( pP
38260 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
38270 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50  GER_READER && pP
38280 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
38290 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50  ER_ERROR );.  pP
382a0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
382b0 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d  ry = (u8)subjInM
382c0 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c  emory;..  if( AL
382d0 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74  WAYS(pPager->eSt
382e0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
382f0 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  R) ){.    assert
38300 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
38310 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
38320 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
38330 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
38340 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
38350 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
38360 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
38370 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
38380 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
38390 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
383a0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
383b0 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
383c0 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
383d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
383e0 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
383f0 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
38400 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
38410 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
38420 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
38430 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
38440 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
38450 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
38460 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
38470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
38480 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
38490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 28       }.        (
384a0 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61 6c 45  void)sqlite3WalE
384b0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
384c0 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20  ger->pWal, 1);. 
384d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
384e0 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20   Grab the write 
384f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20  lock on the log 
38500 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
38510 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a  ful, upgrade to.
38520 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52        ** PAGER_R
38530 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f  ESERVED state. O
38540 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
38550 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
38560 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
38570 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d      ** The busy-
38580 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69  handler is not i
38590 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65  nvoked if anothe
385a0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72  r connection alr
385b0 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f  eady.      ** ho
385c0 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  lds the write-lo
385d0 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  ck. If possible,
385e0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
385f0 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 20 20   will call it.  
38600 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 65 78 46  */.      if( exF
38610 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  lag>=0 ){.      
38620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
38630 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
38640 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
38650 57 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Wal);.      }.  
38660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
38670 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
38680 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
38690 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
386a0 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
386b0 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20  ameter.      ** 
386c0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d  is true, then im
386d0 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64  mediately upgrad
386e0 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43  e this to an EXC
386f0 4c 5