/ Hex Artifact Content
Login

Artifact 4981dc6154ce111361a7cd35eaa26aadf8914ea3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
8460: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
8470: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
8480: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8490: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
84a0: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
84b0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
84c0: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
84d0: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
84e0: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
84f0: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8500: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8510: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8520: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
8530: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
8540: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
8550: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
8560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8570: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
8580: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8590: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
85a0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
85c0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
85d0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
85e0: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
85f0: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8600: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8610: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8620: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
8630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8640: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
8670: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
8680: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8690: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
86c0: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
86d0: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
86e0: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
86f0: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
8700: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
8710: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
8720: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
8730: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
8740: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
8750: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8760: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8770: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8780: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8790: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
87a0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
87b0: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
87c0: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
87d0: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
87e0: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
87f0: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
8800: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8810: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8820: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8830: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8840: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8850: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8860: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8870: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8880: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8890: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
88a0: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
88b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
88c0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88d0: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
88e0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
88f0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8900: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8910: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8920: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8930: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8940: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8950: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8960: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8970: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
89a0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
89b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
89c0: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
89d0: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
89e0: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
89f0: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8a00: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8a10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8a20: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8a30: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8a40: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8a50: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8a60: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8a70: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8a80: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8a90: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8aa0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8ab0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8ac0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8ae0: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8af0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8b00: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8b10: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8b20: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8b30: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8b40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8b50: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8b60: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8b70: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8b80: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8b90: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8ba0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8bb0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8bc0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8bd0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8be0: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8bf0: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8c00: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8c10: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8c20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8c30: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8c40: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8c50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8c60: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8c70: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8c80: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8c90: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8ca0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8cb0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
8cc0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
8cd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
8ce0: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
8cf0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
8d00: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
8d10: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
8d20: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
8d30: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
8d40: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
8d50: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
8d60: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
8d70: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
8d80: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
8d90: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
8da0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
8db0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
8dc0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
8dd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
8de0: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
8df0: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
8e00: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
8e10: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
8e20: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
8e30: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
8e40: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
8e50: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
8e60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
8e70: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
8e80: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
8e90: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
8ea0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
8eb0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
8ec0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
8ed0: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
8ee0: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
8ef0: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
8f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8f10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
8f20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
8f30: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
8f40: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
8f50: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
8f60: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
8f70: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8f80: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
8f90: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
8fa0: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
8fb0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
8fc0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
8fd0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
8fe0: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
8ff0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9000: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9010: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9020: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9030: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
9040: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
9050: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
9060: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
9070: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
9080: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
9090: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
90a0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
90b0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
90c0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
90d0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
90e0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
90f0: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9100: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9110: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9120: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9130: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
9140: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
9150: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
9160: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
9170: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
9180: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
9190: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
91a0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
91b0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
91c0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
91d0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
91e0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
91f0: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9200: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9210: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9220: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9230: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
9240: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
9250: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
9260: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
9270: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
9280: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
9290: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
92a0: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
92b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
92c0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
92d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
92e0: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
92f0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9300: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9310: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9320: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9330: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
9340: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
9350: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
9360: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
9370: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
9380: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
9390: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
93a0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
93b0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
93c0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
93d0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
93e0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
93f0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9400: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9410: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9420: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9430: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
9440: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9450: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
9460: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
9470: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
9480: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
9490: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
94a0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
94b0: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
94c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
94d0: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20  e if this pager 
94e0: 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65  uses a write-ahe
94f0: 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f  ad log instead o
9500: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72  f the usual.** r
9510: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
9520: 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   Otherwise false
9530: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
9540: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61  ITE_OMIT_WAL.sta
9550: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73 65  tic int pagerUse
9560: 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
9570: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  r){.  return (pP
9580: 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a  ager->pWal!=0);.
9590: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
95a0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29 20   pagerUseWal(x) 
95b0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
95c0: 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30  RollbackWal(x) 0
95d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 57  .# define pagerW
95e0: 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79  alFrames(v,w,x,y
95f0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9600: 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
9610: 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  nt(z) SQLITE_OK.
9620: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65  # define pagerBe
9630: 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
9640: 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  on(z) SQLITE_OK.
9650: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
9660: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
9670: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
9680: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
9690: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
96a0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  );.**.** This fu
96b0: 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79  nction runs many
96c0: 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20   asserts to try 
96d0: 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73  to find inconsis
96e0: 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68  tencies in.** th
96f0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
9700: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
9710: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
9720: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
9730: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
9740: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
9750: 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61  r = p;..  /* Sta
9760: 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  te must be valid
9770: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
9780: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9790: 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70  OPEN.       || p
97a0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
97b0: 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c  READER.       ||
97c0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97d0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
97e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
97f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9800: 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
9810: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9820: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
9830: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
9840: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9850: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
9860: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9870: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
9880: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64   );..  /* Regard
9890: 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72  less of the curr
98a0: 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d  ent state, a tem
98b0: 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  p-file connectio
98c0: 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73  n always behaves
98d0: 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68  .  ** as if it h
98e0: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
98f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9900: 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65  base file. It ne
9910: 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a  ver updates.  **
9920: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
9930: 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68  ter field, so th
9940: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
9950: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
9960: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
9970: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
9980: 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d  ==0 || p->eLock=
9990: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
99a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
99b0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
99c0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
99d0: 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20  ntDone );..  /* 
99e0: 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61  If the useJourna
99f0: 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  l flag is clear,
9a00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9a10: 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e  e must be "OFF".
9a20: 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68   .  ** And if th
9a30: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
9a40: 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75  s "OFF", the jou
9a50: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e  rnal file must n
9a60: 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f  ot be open..  */
9a70: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
9a80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9a90: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9aa0: 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61   || p->useJourna
9ab0: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
9ac0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
9ad0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9ae0: 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28  _OFF || !isOpen(
9af0: 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  p->jfd) );..  /*
9b00: 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44   Check that MEMD
9b10: 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63  B implies noSync
9b20: 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  . And an in-memo
9b30: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63  ry journal. Sinc
9b40: 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61  e .  ** this mea
9b50: 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ns an in-memory 
9b60: 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e  pager performs n
9b70: 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20  o IO at all, it 
9b80: 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72  cannot encounter
9b90: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51   .  ** either SQ
9ba0: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
9bb0: 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67  LITE_FULL during
9bc0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69   rollback or whi
9bd0: 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20  le finalizing . 
9be0: 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   ** a journal fi
9bf0: 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68  le. (although th
9c00: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
9c10: 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  nal implementati
9c20: 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74  on may .  ** ret
9c30: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9c40: 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65  _NOMEM while the
9c50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
9c60: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e   being written).
9c70: 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65   It .  ** is the
9c80: 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69  refore not possi
9c90: 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  ble for an in-me
9ca0: 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e  mory pager to en
9cb0: 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20  ter the ERROR . 
9cc0: 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a   ** state..  */.
9cd0: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
9ce0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f     assert( p->no
9cf0: 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65  Sync );.    asse
9d00: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9d10: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9d20: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
9d30: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9d40: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9d50: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
9d60: 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
9d70: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50  rt( p->eState!=P
9d80: 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d  AGER_ERROR && p-
9d90: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
9da0: 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  PEN );.    asser
9db0: 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
9dc0: 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )==0 );.  }..  /
9dd0: 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74  * If changeCount
9de0: 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52  Done is set, a R
9df0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20  ESERVED lock or 
9e00: 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
9e10: 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  held.  ** on the
9e20: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
9e30: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68  sert( pPager->ch
9e40: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30  angeCountDone==0
9e50: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
9e60: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9e70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9e80: 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  >eLock!=PENDING_
9e90: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63  LOCK );..  switc
9ea0: 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a  h( p->eState ){.
9eb0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f      case PAGER_O
9ec0: 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72  PEN:.      asser
9ed0: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
9ee0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9ef0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f00: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9f10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
9f20: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
9f30: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
9f40: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
9f50: 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72  File );.      br
9f60: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9f70: 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20  AGER_READER:.   
9f80: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f90: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9fa0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9fb0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9fc0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
9fd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9fe0: 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
9ff0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72  LOCK );.      br
a000: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a010: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
a020: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a030: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
a040: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
a050: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a060: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a070: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
a080: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a090: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
a0a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a0b0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a0c0: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
a0d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a0e0: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
a0f0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
a100: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a110: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a120: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a130: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a140: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a150: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a160: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a170: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a180: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
a190: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
a1a0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a1b0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
a1c0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a1d0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a1e0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a1f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a200: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a210: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a220: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a230: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a240: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
a250: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
a260: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
a270: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
a280: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
a290: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
a2a0: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
a2b0: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
a2c0: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
a2d0: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
a2e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
a2f0: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
a300: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
a310: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
a320: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
a330: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a340: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a350: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a360: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
a370: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a380: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a390: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a3a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a3b0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a3c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a3d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a3e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a3f0: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
a400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a410: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a420: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a430: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a450: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a460: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a470: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a480: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a490: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
a4a0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a4b0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a4c0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a4d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a4e0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a4f0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a500: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a510: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a520: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a530: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
a540: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a550: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a560: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a570: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a580: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a590: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a5a0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a5b0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a5c0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a5d0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a5e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a5f0: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a600: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a610: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a620: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a630: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a650: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a660: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a670: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a680: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a690: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a6a0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a6b0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a6c0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a6d0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a6e0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a6f0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a700: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a710: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a720: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a730: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a740: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a750: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a760: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a770: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a780: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a790: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a7a0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a7b0: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a7c0: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a7d0: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a7e0: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a7f0: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a800: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a810: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a830: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a840: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a850: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a860: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a870: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a880: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20  ->pPCache)>0 || 
a890: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
a8a0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a8b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31  .  }..  return 1
a8c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
a8d0: 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  ndef NDEBUG */..
a8e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a8f0: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  BUG ./*.** Retur
a900: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
a910: 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   human readable 
a920: 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74  string in a stat
a930: 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e  ic buffer.** con
a940: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74  taining the stat
a950: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
a960: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
a970: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  an argument. Thi
a980: 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64  s.** is intended
a990: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
a9a0: 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f  in debuggers. Fo
a9b0: 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e  r example, as an
a9c0: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
a9d0: 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65  to "print *pPage
a9e0: 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a  r" in gdb:.**.**
a9f0: 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25   (gdb) printf "%
aa00: 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f  s", print_pager_
aa10: 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f  state(pPager).*/
aa20: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72  .static char *pr
aa30: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
aa40: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61  Pager *p){.  sta
aa50: 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30  tic char zRet[10
aa60: 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  24];..  sqlite3_
aa70: 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a  snprintf(1024, z
aa80: 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65  Ret,.      "File
aa90: 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22  name:      %s\n"
aaa0: 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20  .      "State:  
aab0: 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64         %s errCod
aac0: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c  e=%d\n".      "L
aad0: 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73  ock:          %s
aae0: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69  \n".      "Locki
aaf0: 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e  ng mode:  lockin
ab00: 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  g_mode=%s\n".   
ab10: 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65     "Journal mode
ab20: 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  :  journal_mode=
ab30: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63  %s\n".      "Bac
ab40: 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70  king store: temp
ab50: 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64  File=%d memDb=%d
ab60: 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e   useJournal=%d\n
ab70: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
ab80: 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f  :       journalO
ab90: 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48  ff=%lld journalH
aba0: 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20  dr=%lld\n".     
abb0: 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20   "Size:         
abc0: 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69   dbsize=%d dbOri
abd0: 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53  gSize=%d dbFileS
abe0: 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ize=%d\n".      
abf0: 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20  , p->zFilename. 
ac00: 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65       , p->eState
ac10: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  ==PAGER_OPEN    
ac20: 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22          ? "OPEN"
ac30: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ac40: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
ac50: 45 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52  ER          ? "R
ac60: 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20  EADER" :.       
ac70: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ac80: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
ac90: 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b    ? "WRITER_LOCK
aca0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
acb0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
acc0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f  RITER_CACHEMOD ?
acd0: 20 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f   "WRITER_CACHEMO
ace0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
acf0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
ad00: 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20  ITER_DBMOD    ? 
ad10: 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a  "WRITER_DBMOD" :
ad20: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ad30: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
ad40: 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49  _FINISHED ? "WRI
ad50: 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a  TER_FINISHED" :.
ad60: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ad70: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20  e==PAGER_ERROR  
ad80: 20 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f           ? "ERRO
ad90: 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  R" : "?error?". 
ada0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65       , (int)p->e
adb0: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70  rrCode.      , p
adc0: 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
add0: 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c           ? "NO_L
ade0: 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70  OCK" :.        p
adf0: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
ae00: 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45  D_LOCK   ? "RESE
ae10: 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  RVED" :.        
ae20: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
ae30: 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43  IVE_LOCK  ? "EXC
ae40: 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20  LUSIVE" :.      
ae50: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52    p->eLock==SHAR
ae60: 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53  ED_LOCK     ? "S
ae70: 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20  HARED" :.       
ae80: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f   p->eLock==UNKNO
ae90: 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e  WN_LOCK    ? "UN
aea0: 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72  KNOWN" : "?error
aeb0: 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78  ?".      , p->ex
aec0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65  clusiveMode ? "e
aed0: 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72  xclusive" : "nor
aee0: 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  mal".      , p->
aef0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af00: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
af10: 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72  EMORY   ? "memor
af20: 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  y" :.        p->
af30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af40: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
af50: 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20  FF      ? "off" 
af60: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
af70: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
af80: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
af90: 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20  TE   ? "delete" 
afa0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
afb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
afc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
afd0: 49 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22  IST  ? "persist"
afe0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aff0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b000: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
b010: 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74  NCATE ? "truncat
b020: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b030: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b040: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
b050: 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20  AL      ? "wal" 
b060: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
b070: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70    , (int)p->temp
b080: 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65  File, (int)p->me
b090: 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65  mDb, (int)p->use
b0a0: 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20  Journal.      , 
b0b0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  p->journalOff, p
b0c0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
b0d0: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53     , (int)p->dbS
b0e0: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f  ize, (int)p->dbO
b0f0: 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  rigSize, (int)p-
b100: 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b  >dbFileSize.  );
b110: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
b120: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b130: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
b140: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
b150: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
b160: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
b170: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
b180: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
b190: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
b1a0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
b1b0: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
b1c0: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
b1d0: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
b1e0: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
b1f0: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
b200: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
b210: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
b220: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
b230: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
b240: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
b250: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
b260: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
b270: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
b280: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
b290: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
b2a0: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
b2b0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
b2c0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
b2d0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
b2e0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
b2f0: 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   *p;.  Pgno pgno
b300: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
b310: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
b320: 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  ; i<pPager->nSav
b330: 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  epoint; i++){.  
b340: 20 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61    p = &pPager->a
b350: 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20  Savepoint[i];.  
b360: 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d    if( p->nOrig>=
b370: 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74  pgno && 0==sqlit
b380: 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e  e3BitvecTestNotN
b390: 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  ull(p->pInSavepo
b3a0: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
b3b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
b3c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
b3d0: 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
b3e0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
b3f0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
b400: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
b410: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
b420: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
b430: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
b440: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
b450: 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
b460: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
b470: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
b480: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
b490: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65  pPg->pgno);.}.#e
b4a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
b4b0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
b4c0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
b4d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b4e0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
b4f0: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
b500: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
b510: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
b520: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
b530: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
b540: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
b550: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
b560: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
b570: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
b580: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
b590: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
b5a0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
b5b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
b5c0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
b5d0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
b5e0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
b5f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
b600: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
b610: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
b620: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
b630: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b640: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
b650: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
b660: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b670: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
b680: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b690: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
b6a0: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
b6b0: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
b6c0: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
b6d0: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
b6e0: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
b6f0: 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ,B).../*.** Writ
b700: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b710: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
b720: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
b730: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
b740: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
b750: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
b760: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
b770: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
b780: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
b790: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
b7a0: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
b7b0: 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20  set, u32 val){. 
b7c0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70   char ac[4];.  p
b7d0: 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c  ut32bits(ac, val
b7e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
b7f0: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
b800: 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d  c, 4, offset);.}
b810: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
b820: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b830: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
b840: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
b850: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a  ither NO_LOCK.**
b860: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
b870: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   Regardless of w
b880: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b890: 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  e call to xUnloc
b8a0: 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c  k().** succeeds,
b8b0: 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
b8c0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
b8d0: 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65   match the (atte
b8e0: 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e  mpted) new lock.
b8f0: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
b900: 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73  f Pager.eLock is
b910: 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
b920: 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66  LOCK when this f
b930: 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61  unction is.** ca
b940: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
b950: 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20  ify it. See the 
b960: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
b970: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a  e #define of .**
b980: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
b990: 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
b9a0: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
b9b0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c  tic int pagerUnl
b9c0: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
b9d0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
b9e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b9f0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
ba00: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
ba10: 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
ba20: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b  er->eLock==eLock
ba30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
ba40: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock==NO_LOCK || 
ba50: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
ba60: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
ba70: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
ba80: 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
ba90: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66  ager)==0 );.  if
baa0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
bab0: 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
bac0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
bad0: 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k>=eLock );.    
bae0: 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c  rc = pPager->noL
baf0: 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ock ? SQLITE_OK 
bb00: 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  : sqlite3OsUnloc
bb10: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
bb20: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ock);.    if( pP
bb30: 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  ager->eLock!=UNK
bb40: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
bb50: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
bb60: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
bb70: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
bb80: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
bb90: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
bba0: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
bbb0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
bbc0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
bbd0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
bbe0: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
bbf0: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
bc00: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
bc10: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
bc20: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
bc30: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
bc40: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
bc50: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
bc60: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
bc70: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
bc80: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
bc90: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
bca0: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
bcb0: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
bcc0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
bcd0: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
bce0: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
bcf0: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
bd00: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
bd10: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
bd20: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
bd30: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
bd40: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
bd50: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
bd60: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
bd70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
bd80: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
bd90: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
bda0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
bdb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
bdc0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
bdd0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
bde0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
bdf0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
be00: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
be10: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
be20: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
be30: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
be40: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
be50: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
be60: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
be70: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
be80: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
be90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
bea0: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
beb0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
bec0: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
bed0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
bee0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
bef0: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
bf00: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
bf10: 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
bf20: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bf30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
bf40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bf50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
bf60: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
bf70: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
bf80: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
bf90: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
bfa0: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
bfb0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
bfc0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
bfd0: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
bfe0: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
bff0: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
c000: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
c010: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
c020: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
c030: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
c040: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
c050: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
c060: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
c070: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
c080: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
c090: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
c0a0: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
c0b0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  size..**.** The 
c0c0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
c0d0: 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62  also always enab
c0e0: 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  led for temporar
c0f0: 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a  y files. It is.*
c100: 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61  * an error to ca
c110: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
c120: 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70   if pPager is op
c130: 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  ened on an in-me
c140: 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
c150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
c160: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
c170: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
c180: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
c190: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
c1a0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c1b0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
c1c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c1d0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
c1e0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
c1f0: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
c200: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
c210: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
c220: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
c230: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
c240: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
c250: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
c260: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
c270: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
c280: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
c290: 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20     int dc;      
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
c2c0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
c2d0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f  /.    int nSecto
c2e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c2f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
c300: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e  r size */.    in
c310: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c330: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
c340: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
c350: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c360: 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  );.    dc = sqli
c370: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
c380: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
c390: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63  r->fd);.    nSec
c3a0: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
c3b0: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a  ctorSize;.    sz
c3c0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
c3d0: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
c3e0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
c3f0: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
c400: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
c410: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c420: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
c430: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
c440: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
c450: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
c460: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
c470: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
c480: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c490: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
c4a0: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
c4b0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
c4c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
c4d0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
c4e0: 69 6e 65 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  ine jrnlBufferSi
c4f0: 7a 65 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ze(x) 0.#endif..
c500: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c510: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c520: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c530: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c540: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c550: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c560: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c570: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c580: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c590: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c5a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c5b0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c5c0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c5d0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c5e0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c5f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c600: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c610: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c620: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c630: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c640: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c650: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c660: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c670: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c680: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c690: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c6a0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c6b0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c6c0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c6d0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c6e0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c6f0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c700: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c710: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c720: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c730: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c740: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c750: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c760: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c780: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c790: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c7a0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c7b0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c7c0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c7d0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c7e0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c7f0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c800: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c810: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c820: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c830: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c840: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c850: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c860: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c870: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c880: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c890: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c8a0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c8b0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c8c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c8d0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c8e0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c8f0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c900: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c910: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c920: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c930: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c940: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c950: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c960: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c970: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c980: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c990: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c9a0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c9b0: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c9c0: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c9d0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c9e0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c9f0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
ca00: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
ca10: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
ca20: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
ca30: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
ca40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ca50: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
ca60: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
ca70: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
ca80: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
ca90: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
caa0: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
cab0: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
cac0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
cad0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
cae0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
caf0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
cb00: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
cb10: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
cb20: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
cb30: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
cb40: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
cb50: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
cb60: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
cb70: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
cb80: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
cb90: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
cba0: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
cbb0: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
cbc0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
cbd0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cbe0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cbf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cc00: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cc10: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
cc20: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cc30: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cc40: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cc50: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cc60: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cc70: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
cc80: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
cc90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
cca0: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
ccb0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
ccc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
ccd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cce0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
ccf0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cd00: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cd10: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cd20: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
cd30: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
cd40: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
cd50: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cd60: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
cd70: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cd80: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cd90: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cda0: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cdb0: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cdc0: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cdd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cde0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cdf0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
ce00: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
ce10: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
ce20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
ce30: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
ce40: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
ce50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ce60: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
ce70: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ce80: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ce90: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
cea0: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
ceb0: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cec0: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
ced0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cee0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cef0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cf00: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cf10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cf20: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
cf30: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cf40: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cf50: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf70: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cf80: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cf90: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cfa0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cfc0: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cfd0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
cfe0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
d010: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
d020: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
d030: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
d040: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
d050: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
d060: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
d070: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
d080: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d090: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d0a0: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
d0b0: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
d0c0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d0d0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d0e0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
d0f0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
d100: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
d110: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
d120: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d130: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d140: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d150: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d160: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d170: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d180: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d190: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d1a0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d1b0: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d1c0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d1d0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d1e0: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d1f0: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d200: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d210: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d220: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d230: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d240: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d250: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d260: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d270: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d280: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d290: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d2a0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d2b0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d2c0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d2d0: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d2e0: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d2f0: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d300: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d310: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d320: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d330: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d340: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d350: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d360: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d370: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d380: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d390: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d3a0: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d3b0: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d3c0: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d3d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d3e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d3f0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d400: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d410: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d420: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d430: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d440: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d450: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d460: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d470: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d480: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d490: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d4a0: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d4b0: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d4c0: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d4d0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d500: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d550: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d560: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d570: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d580: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d590: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d5a0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d5b0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d5c0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d5d0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d5e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d5f0: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d600: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d610: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d620: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d630: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d640: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d650: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d660: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d670: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d680: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d690: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d6a0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d6b0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d6c0: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d6e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d6f0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d700: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d710: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d720: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d730: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d740: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d750: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d760: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d770: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d780: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d790: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d7a0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d7b0: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d7c0: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d7d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d7e0: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d7f0: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d800: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d810: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d820: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d830: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d840: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d850: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d860: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d870: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d880: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d890: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d8a0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d8b0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d8c0: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d8d0: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d8e0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d8f0: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d900: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d910: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d920: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d930: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d940: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d950: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d960: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d970: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d980: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d990: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d9a0: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d9b0: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d9c0: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
d9d0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
d9e0: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
d9f0: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
da00: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
da10: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
da20: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
da30: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
da40: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
da50: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
da60: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
da70: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
da80: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
da90: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
daa0: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
dab0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
dac0: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
dad0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
dae0: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
daf0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
db00: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
db30: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
db40: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
db50: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73  r->jfd) );.  ass
db60: 65 72 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75  ert( !sqlite3Jou
db70: 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
db80: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
db90: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
dba0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
dbb0: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
dbc0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
dbd0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
dbe0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
dbf0: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
dc00: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
dc10: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
dc20: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
dc30: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
dc40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
dc50: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
dc60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
dc70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dc80: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
dc90: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
dca0: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
dcb0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
dcc0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
dcd0: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
dce0: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
dcf0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
dd00: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
dd10: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
dd20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dd30: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
dd40: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
dd50: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
dd60: 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
dd70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
dd80: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
dd90: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
dda0: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
ddb0: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
ddc0: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
ddd0: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
dde0: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
ddf0: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
de00: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
de10: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
de20: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
de30: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
de40: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
de50: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
de60: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
de70: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
de80: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
de90: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
dea0: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
deb0: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
dec0: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
ded0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
dee0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
def0: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
df00: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
df10: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
df20: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
df30: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
df40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
df50: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
df60: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
df70: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
df80: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
df90: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
dfa0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
dfb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
dfc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
dfd0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
dfe0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
dff0: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
e000: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
e010: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
e020: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
e030: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
e040: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
e050: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
e060: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
e070: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
e080: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
e090: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
e0a0: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
e0b0: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
e0c0: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
e0d0: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
e0e0: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
e0f0: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
e100: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
e110: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
e120: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
e130: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
e140: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
e150: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
e160: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
e170: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
e180: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
e190: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
e1a0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
e1b0: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
e1c0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
e1d0: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
e1e0: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
e1f0: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
e200: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
e210: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
e220: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
e230: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e240: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e250: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
e260: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e270: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
e280: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
e290: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
e2a0: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
e2b0: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
e2c0: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
e2d0: 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67  ader = (u32)pPag
e2e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20  er->pageSize;/* 
e2f0: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
e300: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
e310: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
e320: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e340: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
e350: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
e360: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e390: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
e3a0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e3b0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
e3c0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
e3d0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
e3e0: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
e3f0: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
e400: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
e410: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
e420: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
e430: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
e440: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
e450: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
e460: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
e470: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
e480: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
e490: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
e4a0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
e4b0: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
e4c0: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
e4d0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
e4e0: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
e4f0: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
e500: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
e510: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
e520: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e530: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
e550: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e560: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
e570: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e580: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
e590: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
e5a0: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
e5b0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
e5c0: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
e5d0: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ger);..  /* .  *
e5e0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
e5f0: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
e600: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
e610: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
e620: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
e630: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
e640: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
e650: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
e660: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
e670: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
e680: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
e690: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e6a0: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
e6b0: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
e6c0: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
e6d0: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
e6e0: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
e6f0: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
e700: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
e710: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
e720: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
e730: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
e740: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
e750: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
e760: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
e770: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
e780: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
e790: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
e7a0: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
e7b0: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
e7c0: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
e7d0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
e7e0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
e7f0: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
e800: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
e810: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
e820: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
e830: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
e840: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
e850: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
e860: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
e870: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
e880: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
e890: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
e8a0: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
e8b0: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
e8c0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
e8d0: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
e8e0: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
e8f0: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
e900: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
e910: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
e920: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
e930: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
e940: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
e950: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
e960: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
e970: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
e980: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
e990: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
e9a0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
e9b0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
e9c0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
e9d0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
e9e0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
e9f0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
ea00: 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67  >noSync || (pPag
ea10: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
ea20: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
ea30: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
ea40: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
ea50: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
ea60: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
ea70: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
ea80: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
ea90: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
eaa0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
eab0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
eac0: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
ead0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
eae0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
eaf0: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
eb00: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
eb10: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
eb20: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
eb30: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
eb40: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
eb50: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
eb60: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20  itializer */ .  
eb70: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
eb80: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
eb90: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
eba0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
ebb0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
ebc0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
ebd0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
ebe0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
ebf0: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
ec00: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
ec10: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
ec20: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
ec30: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ec40: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
ec50: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
ec60: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
ec70: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
ec80: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
ec90: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
eca0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
ecb0: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
ecc0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
ecd0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
ece0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
ecf0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ed00: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ed10: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
ed20: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
ed30: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
ed40: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
ed50: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
ed60: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
ed70: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
ed80: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
ed90: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
eda0: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
edb0: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
edc0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
edd0: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
ede0: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
edf0: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
ee00: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
ee10: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
ee20: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
ee30: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
ee40: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ee50: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
ee60: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
ee70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ee80: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
ee90: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
eea0: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
eeb0: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
eec0: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
eed0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
eee0: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
eef0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
ef00: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
ef10: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
ef20: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
ef30: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
ef40: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
ef50: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
ef60: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
ef70: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
ef80: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
ef90: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
efa0: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
efb0: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
efc0: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
efd0: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
efe0: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
eff0: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
f000: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
f010: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
f020: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
f030: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
f040: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
f050: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
f060: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
f070: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
f080: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
f090: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
f0a0: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
f0b0: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
f0c0: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
f0d0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
f0e0: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
f0f0: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
f100: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
f110: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
f120: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
f130: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
f140: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
f150: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
f160: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
f170: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
f180: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
f190: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
f1a0: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
f1b0: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
f1c0: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
f1d0: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
f1e0: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
f1f0: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
f200: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
f210: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
f220: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
f230: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
f240: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
f250: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f260: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
f270: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
f280: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
f290: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
f2a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f2b0: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
f2c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f2d0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
f2e0: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
f2f0: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
f300: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
f310: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
f320: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
f330: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
f340: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
f350: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
f360: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
f370: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f380: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
f390: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
f3a0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
f3b0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
f3c0: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
f3d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
f3e0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
f3f0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
f400: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
f410: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
f420: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
f430: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
f440: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
f450: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
f460: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
f470: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
f480: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
f490: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
f4a0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
f4b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f4c0: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
f4d0: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
f4e0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
f4f0: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
f500: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
f510: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
f520: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
f530: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
f540: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
f550: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
f560: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
f570: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
f580: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
f590: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
f5a0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
f5b0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
f5c0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
f5d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
f5e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
f5f0: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
f600: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
f610: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f620: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
f630: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
f640: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
f650: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
f660: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
f670: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
f680: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
f690: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
f6a0: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
f6b0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f6c0: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
f6d0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
f6e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f6f0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
f700: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f720: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
f730: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
f740: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
f750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f760: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
f770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
f780: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
f790: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
f7a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f7b0: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
f7c0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
f7d0: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
f800: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
f810: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
f820: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f850: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
f860: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
f870: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
f880: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
f890: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
f8a0: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f8c0: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
f8d0: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
f8e0: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
f8f0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
f900: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
f910: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
f920: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
f930: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
f940: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
f950: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f960: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
f970: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
f980: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
f990: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
f9a0: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
f9b0: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
f9c0: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
f9d0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
f9e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
f9f0: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
fa00: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
fa10: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
fa20: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
fa30: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
fa40: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
fa50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fa60: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
fa70: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
fa80: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
fa90: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
faa0: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
fab0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fac0: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
fad0: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
fae0: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
faf0: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
fb00: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
fb10: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
fb20: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
fb30: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
fb40: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
fb50: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
fb60: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
fb70: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
fb80: 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
fb90: 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
fba0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
fbb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fbc0: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
fbd0: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
fbe0: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
fbf0: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
fc00: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fc10: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
fc20: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
fc30: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
fc40: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
fc50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
fc60: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
fc70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
fc80: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
fc90: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
fca0: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
fcb0: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
fcc0: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
fcd0: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
fce0: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
fcf0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
fd00: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
fd10: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
fd20: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
fd30: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
fd40: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
fd50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
fd60: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fd70: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fd80: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
fd90: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
fda0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fdb0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
fdc0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
fdd0: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
fde0: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
fdf0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fe00: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
fe10: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
fe20: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
fe30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
fe40: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
fe50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
fe60: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
fe70: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
fe80: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
fe90: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
fea0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
feb0: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
fec0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
fed0: 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
fee0: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
fef0: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  eader */..    /*
ff00: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
ff10: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
ff20: 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
ff30: 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
ff40: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
ff50: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
ff60: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
ff70: 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
ff80: 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
ff90: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
ffa0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
ffb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
ffc0: 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
ffd0: 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
ffe0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fff0: 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f  }..    /* Versio
10000 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
10010 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20  or to 3.5.8 set 
10020 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69  the page-size fi
10030 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  eld of the.    *
10040 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
10050 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69   to zero. In thi
10060 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74  s case, assume t
10070 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61  hat the Pager.pa
10080 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61  geSize.    ** va
10090 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64  riable is alread
100a0 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72  y set to the cor
100b0 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a  rect page size..
100c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
100d0 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  PageSize==0 ){. 
100e0 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d       iPageSize =
100f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
10100 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
10110 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
10120 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
10130 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
10140 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
10150 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
10160 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
10170 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
10180 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
10190 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
101a0 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
101b0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
101c0 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
101d0 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
101e0 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
101f0 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
10200 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
10210 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
10220 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
10230 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
10240 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
10250 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
10260 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
10270 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
10280 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
10290 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
102a0 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
102b0 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
102c0 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
102d0 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
102e0 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
102f0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
10300 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
10310 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
10320 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
10330 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10340 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
10350 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
10360 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
10370 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
10380 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
10390 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
103a0 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
103b0 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
103c0 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
103d0 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
103e0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
103f0 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
10400 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10410 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
10420 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
10430 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
10440 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10450 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
10460 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
10470 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
10480 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
10490 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
104a0 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
104b0 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
104c0 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
104d0 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
104e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
104f0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
10500 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a  Pager, &iPageSiz
10510 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  e, -1);.    test
10520 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
10530 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  _OK );..    /* U
10540 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
10550 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
10560 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10570 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
10580 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10590 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
105a0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
105b0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
105c0 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
105d0 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
105e0 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
105f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
10600 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
10610 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
10620 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
10630 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
10640 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
10650 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
10660 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
10670 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
10680 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
10690 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
106a0 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
106b0 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
106c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
106d0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
106e0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
106f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
10700 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
10710 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
10720 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
10730 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
10740 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
10750 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
10760 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
10770 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10780 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
10790 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
107a0 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
107b0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
107c0 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
107d0 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
107e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
107f0 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
10800 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
10810 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
10820 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
10830 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
10840 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
10850 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
10860 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
10870 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
10880 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
10890 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
108a0 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
108b0 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
108c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
108d0 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
108e0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
108f0 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
10900 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
10910 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
10920 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
10930 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
10940 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
10950 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
10960 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
10970 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
10980 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
10990 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
109a0 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
109b0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
109c0 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
109d0 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
109e0 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
109f0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
10a00 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
10a10 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
10a20 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
10a30 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
10a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10a50 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
10a60 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
10a70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
10a80 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
10a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10ab0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
10ac0 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ae0 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
10af0 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
10b00 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
10b30 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
10b40 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
10b50 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
10b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10b70 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
10b80 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
10b90 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bb0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
10bc0 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
10bd0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
10be0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
10bf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10c00 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
10c10 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  ger) );..  if( !
10c20 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70  zMaster .   || p
10c30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10c40 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10c50 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
10c60 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
10c70 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20  er->jfd).  ){.  
10c80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10c90 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
10ca0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
10cb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10cc0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
10cd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10ce0 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  Off );..  /* Cal
10cf0 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
10d00 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
10d10 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
10d20 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
10d30 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
10d40 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
10d50 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
10d60 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
10d70 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
10d80 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
10d90 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
10da0 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
10db0 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
10dc0 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
10dd0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10de0 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
10df0 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
10e00 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
10e10 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
10e20 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
10e30 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
10e40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
10e50 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
10e60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10e70 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
10e80 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
10e90 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
10ea0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10eb0 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
10ec0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10ed0 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
10ee0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10ef0 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
10f00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
10f10 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
10f20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
10f30 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
10f40 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10f50 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10f60 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
10f70 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
10f80 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
10f90 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
10fa0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
10fb0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
10fc0 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
10fd0 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10fe0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10ff0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
11000 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
11010 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
11020 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
11030 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
11040 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
11050 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
11060 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
11070 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
11080 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
11090 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
110a0 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 8,.           
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b        iHdrOff+4+
110d0 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
110e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
110f0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
11100 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
11110 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a  aster+20);..  /*
11120 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11130 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
11140 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
11150 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
11160 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
11170 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
11180 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11190 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
111a0 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
111b0 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
111c0 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
111d0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
111e0 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
111f0 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
11200 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
11210 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
11220 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
11230 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
11240 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
11250 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
11260 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
11270 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
11280 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
11290 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
112a0 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
112b0 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
112c0 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
112d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
112e0 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
112f0 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
11300 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
11310 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
11320 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
11330 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
11340 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
11350 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
11360 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
11370 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
11380 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
11390 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
113a0 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
113b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
113c0 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65  ** Discard the e
113d0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
113e0 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
113f0 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73  page-cache..*/.s
11400 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11410 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
11420 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  ager){.  pPager-
11430 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
11440 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
11450 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
11460 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
11470 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
11480 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
11490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
114a0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61   the pPager->iDa
114b0 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a  taVersion value.
114c0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61  */.u32 sqlite3Pa
114d0 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50  gerDataVersion(P
114e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
114f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11500 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
11510 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  EN );.  return p
11520 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
11530 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ion;.}../*.** Fr
11540 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11550 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
11560 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
11570 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
11580 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
11590 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
115a0 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
115b0 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
115c0 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
115d0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
115e0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
115f0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
11600 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11610 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
11620 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11630 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11650 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
11660 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
11670 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
11680 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11690 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
116a0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
116b0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
116c0 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
116d0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
116e0 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
116f0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11700 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
11710 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
11720 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a  emory(pPager->sj
11730 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  fd) ){.    sqlit
11740 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
11750 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->sjfd);.  }.  s
11760 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
11770 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b  er->aSavepoint);
11780 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65  .  pPager->aSave
11790 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
117a0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
117b0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
117c0 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f  SubRec = 0;.}../
117d0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74  *.** Set the bit
117e0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
117f0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
11800 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
11810 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61  .** bitvecs of a
11820 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
11830 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ts. Return SQLIT
11840 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
11850 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ul.** or SQLITE_
11860 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
11870 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
11880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11890 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
118a0 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61  tvecs(Pager *pPa
118b0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
118c0 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
118e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
118f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11900 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52  E_OK;       /* R
11910 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20  esult code */.. 
11920 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
11930 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
11940 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  ; ii++){.    Pag
11950 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
11960 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
11970 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66  oint[ii];.    if
11980 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67  ( pgno<=p->nOrig
11990 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20   ){.      rc |= 
119a0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
119b0 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
119c0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74  , pgno);.      t
119d0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
119e0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
119f0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
11a00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
11a10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
11a20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11a30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11a40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
11a50 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
11a60 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
11a70 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e  usive mode and n
11a80 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52  ot.** in the ERR
11a90 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
11aa0 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73  ise, it switches
11ab0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41   the pager to PA
11ac0 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74  GER_OPEN.** stat
11ad0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
11ae0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
11af0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
11b00 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62   mode, the datab
11b10 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  ase file is.** c
11b20 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b  ompletely unlock
11b30 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  ed. If the file 
11b40 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20  is unlocked and 
11b50 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
11b60 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69  does.** not exhi
11b70 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41  bit the UNDELETA
11b80 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72  BLE_WHEN_OPEN pr
11b90 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72  operty, the jour
11ba0 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  nal file is.** c
11bb0 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20  losed (if it is 
11bc0 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  open)..**.** If 
11bd0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11be0 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
11bf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
11c00 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a  s called, the .*
11c10 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
11c20 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72  e pager cache ar
11c30 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f  e discarded befo
11c40 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63  re switching bac
11c50 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45  k to .** the OPE
11c60 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c  N state. Regardl
11c70 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
11c80 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
11c90 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a  xclusive-mode.**
11ca0 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75   or not, any jou
11cb0 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69  rnal file left i
11cc0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
11cd0 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65  m will be treate
11ce0 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f  d.** as a hot-jo
11cf0 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
11d00 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74   back the next t
11d10 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73  ime a read-trans
11d20 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65  action.** is ope
11d30 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20  ned (by this or 
11d40 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e  by any other con
11d50 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61  nection)..*/.sta
11d60 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
11d70 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
11d80 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  ger){..  assert(
11d90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11da0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20  =PAGER_READER . 
11db0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
11dc0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
11dd0 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  PEN .       || p
11de0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11df0 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b  AGER_ERROR .  );
11e00 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
11e10 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
11e20 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
11e30 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11e40 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  al = 0;.  releas
11e50 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
11e60 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
11e70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
11e80 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
11e90 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
11ea0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71  ->jfd) );.    sq
11eb0 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
11ec0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
11ed0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50  r->pWal);.    pP
11ee0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
11ef0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c  AGER_OPEN;.  }el
11f00 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
11f10 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
11f20 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
11f50 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67   returned by pag
11f60 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a  erUnlockDb() */.
11f70 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73      int iDc = is
11f80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
11f90 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  ?sqlite3OsDevice
11fa0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
11fb0 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a  pPager->fd):0;..
11fc0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
11fd0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73  erating system s
11fe0 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20  upport deletion 
11ff0 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74  of open files, t
12000 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65  hen.    ** close
12010 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12020 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20  e when dropping 
12030 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
12040 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20  k.  Otherwise.  
12050 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e    ** another con
12060 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75  nection with jou
12070 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65  rnal_mode=delete
12080 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68   might delete th
12090 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75  e file.    ** ou
120a0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e  t from under us.
120b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
120c0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
120d0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20  ALMODE_MEMORY   
120e0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
120f0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12100 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
12110 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
12120 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12130 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
12140 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
12150 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12160 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12170 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31  DELETE   & 5)!=1
12180 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12190 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
121a0 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29  DE_TRUNCATE & 5)
121b0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
121c0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
121d0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26  LMODE_PERSIST  &
121e0 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66   5)==1 );.    if
121f0 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49  ( 0==(iDc & SQLI
12200 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
12210 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a  ABLE_WHEN_OPEN).
12220 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67       || 1!=(pPag
12230 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
12240 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  & 5).    ){.    
12250 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12260 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
12270 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12280 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12290 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
122a0 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  and the call to 
122b0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
122c0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
122d0 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63  fails, set the c
122e0 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55  urrent lock to U
122f0 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
12300 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20   the comment.   
12310 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64   ** above the #d
12320 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57  efine for UNKNOW
12330 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
12340 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79  planation of why
12350 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   this.    ** is 
12360 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
12370 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
12380 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
12390 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69   NO_LOCK);.    i
123a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
123b0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
123c0 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te==PAGER_ERROR 
123d0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
123e0 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e  >eLock = UNKNOWN
123f0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  _LOCK;.    }..  
12400 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73    /* The pager s
12410 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e  tate may be chan
12420 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45  ged from PAGER_E
12430 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50  RROR to PAGER_OP
12440 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77  EN here.    ** w
12450 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20  ithout clearing 
12460 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  the error code. 
12470 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f  This is intentio
12480 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a  nal - the error.
12490 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63      ** code is c
124a0 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63  leared and the c
124b0 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68  ache reset in th
124c0 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20  e block below.. 
124d0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
124e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
124f0 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  e || pPager->eSt
12500 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
12510 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
12520 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
12530 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
12540 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12550 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OPEN;.  }..  /* 
12560 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
12570 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
12580 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12590 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
125a0 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  be.  ** trusted.
125b0 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20   Now that there 
125c0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
125d0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
125e0 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a   the pager,.  **
125f0 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d   it can safely m
12600 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ove back to PAGE
12610 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68  R_OPEN state. Th
12620 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f  is happens in bo
12630 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61  th.  ** normal a
12640 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63  nd exclusive-loc
12650 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2a 0a  king mode..  **.
12660 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
12670 54 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  There is no way 
12680 6f 75 74 20 6f 66 20 74 68 65 20 65 72 72 6f 72  out of the error
12690 20 73 74 61 74 65 20 66 6f 72 20 74 65 6d 70 20   state for temp 
126a0 66 69 6c 65 73 2e 0a 20 20 2a 2a 20 54 68 69 73  files..  ** This
126b0 20 69 73 20 62 65 63 61 75 73 65 20 69 74 20 69   is because it i
126c0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
126d0 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 72 65 73  o call pager_res
126e0 65 74 28 29 20 6f 6e 20 61 20 74 65 6d 70 0a 20  et() on a temp. 
126f0 20 2a 2a 20 66 69 6c 65 20 70 61 67 65 72 20 28   ** file pager (
12700 61 73 20 74 68 69 73 20 6d 61 79 20 64 69 73 63  as this may disc
12710 61 72 64 20 74 68 65 20 6f 6e 6c 79 20 63 6f 70  ard the only cop
12720 79 20 6f 66 20 73 6f 6d 65 20 64 61 74 61 29 2e  y of some data).
12730 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12740 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12750 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
12760 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
12770 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12780 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
12790 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  tempFile==0 ){. 
127a0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
127b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
127c0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
127d0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
127e0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
127f0 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12810 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12820 3d 20 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72  = (isOpen(pPager
12830 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45 52 5f 4f  ->jfd) ? PAGER_O
12840 50 45 4e 20 3a 20 50 41 47 45 52 5f 52 45 41 44  PEN : PAGER_READ
12850 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ER);.    }.    i
12860 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
12870 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
12880 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
12890 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50  d, 0, 0);.    pP
128a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
128b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
128c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
128d0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
128e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
128f0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
12900 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
12910 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12920 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12930 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
12940 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
12950 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12960 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12970 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12980 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12990 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
129a0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
129b0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
129c0 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
129d0 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
129e0 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
129f0 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
12a00 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
12a10 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12a20 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12a30 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12a40 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
12a50 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
12a60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
12a70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
12a80 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12a90 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
12aa0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12ab0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
12ac0 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
12ad0 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
12ae0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
12af0 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
12b00 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
12b10 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12b20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12b30 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12b40 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
12b50 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
12b60 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
12b70 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
12b80 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
12b90 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
12ba0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12bb0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
12bc0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12bd0 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
12be0 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
12bf0 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
12c00 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
12c10 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12c20 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12c30 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12c40 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
12c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12c60 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
12c70 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
12c80 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
12c90 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
12ca0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12cb0 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12cc0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
12cd0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12ce0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12cf0 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
12d00 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
12d10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12d20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
12d30 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
12d40 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
12d50 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
12d60 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
12d70 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
12d80 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
12d90 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12da0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12db0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12dc0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12dd0 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
12de0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
12df0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
12e00 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
12e10 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
12e20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
12e30 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
12e40 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
12e50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12e60 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
12e70 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12e80 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
12e90 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
12ea0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12eb0 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
12ec0 2a 0a 2a 2a 20 54 68 65 20 77 72 69 74 65 20 74  *.** The write t
12ed0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20  ransaction open 
12ee0 6f 6e 20 74 68 65 20 70 61 67 65 72 20 70 61 73  on the pager pas
12ef0 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
12f00 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 62  argument is.** b
12f10 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20  eing committed. 
12f20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
12f30 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 61 6c  turns true if al
12f40 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 73 68  l dirty pages sh
12f50 6f 75 6c 64 0a 2a 2a 20 62 65 20 66 6c 75 73 68  ould.** be flush
12f60 65 64 20 74 6f 20 64 69 73 6b 2c 20 6f 72 20 66  ed to disk, or f
12f70 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
12f80 50 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20  Pages should be 
12f90 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 0a  flushed to disk.
12fa0 2a 2a 20 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66  ** unless one of
12fb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
12fc0 73 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  s true:.**.**   
12fd0 2a 20 54 68 65 20 64 62 20 69 73 20 61 6e 20 69  * The db is an i
12fe0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
12ff0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  e..**.**   * The
13000 20 64 62 20 69 73 20 61 20 74 65 6d 70 6f 72 61   db is a tempora
13010 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
13020 74 68 65 20 64 62 20 66 69 6c 65 20 68 61 73 20  the db file has 
13030 6e 6f 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  not been opened.
13040 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  .**.**   * The d
13050 62 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  b is a temporary
13060 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
13070 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
13080 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 20 20   less than.**   
13090 20 20 43 2f 34 20 64 69 72 74 79 20 70 61 67 65    C/4 dirty page
130a0 73 2c 20 77 68 65 72 65 20 43 20 69 73 20 74 68  s, where C is th
130b0 65 20 63 6f 6e 66 69 67 75 72 65 64 20 63 61 63  e configured cac
130c0 68 65 2d 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  he-size..*/.stat
130d0 69 63 20 69 6e 74 20 70 61 67 65 72 46 6c 75 73  ic int pagerFlus
130e0 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72 20  hOnCommit(Pager 
130f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
13100 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
13110 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
13120 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
13130 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75  ager->fd) ) retu
13140 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 28  rn 0;.  return (
13150 73 71 6c 69 74 65 33 50 43 61 63 68 65 50 65 72  sqlite3PCachePer
13160 63 65 6e 74 44 69 72 74 79 28 70 50 61 67 65 72  centDirty(pPager
13170 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32 35 29 3b  ->pPCache)>=25);
13180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
13190 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
131a0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
131b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
131c0 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
131d0 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
131e0 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
131f0 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
13200 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
13210 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
13220 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
13230 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
13240 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
13250 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
13260 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13270 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
13280 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
13290 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
132a0 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
132b0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
132c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
132d0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
132e0 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
132f0 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c  e. If it is call
13300 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e  ed.** in PAGER_N
13310 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41  ONE or PAGER_SHA
13320 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68  RED state and th
13330 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c  e lock held is l
13340 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65  ess.** exclusive
13350 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44   than a RESERVED
13360 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e   lock, it is a n
13370 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  o-op..**.** Othe
13380 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
13390 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
133a0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
133b0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
133c0 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
133d0 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
133e0 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
133f0 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
13400 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
13410 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
13420 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
13430 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
13440 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
13450 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
13460 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
13470 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
13480 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
13490 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
134a0 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
134b0 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
134c0 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
134d0 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
134e0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
134f0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13500 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
13510 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
13520 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
13530 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
13540 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
13550 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
13560 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
13570 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
13580 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
13590 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
135a0 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
135b0 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
135c0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
135d0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
135e0 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
135f0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13600 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
13610 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
13620 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
13630 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
13640 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
13650 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
13660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13670 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
13680 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
13690 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
136a0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
136b0 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
136c0 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
136d0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
136e0 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
136f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
13700 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
13710 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
13720 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
13730 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
13740 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
13750 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
13760 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
13770 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
13780 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
13790 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
137a0 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
137b0 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
137c0 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
137d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
137e0 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
137f0 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
13800 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
13810 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
13820 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
13830 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13840 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
13850 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
13860 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
13870 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
13880 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
13890 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
138a0 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
138b0 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50  pager moves to P
138c0 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
138d0 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67  e..** If running
138e0 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
138f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  e rollback mode,
13900 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
13910 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77   file is .** dow
13920 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41  ngraded to a SHA
13930 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13940 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
13950 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
13960 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  r occurs. If an 
13970 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
13980 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68  ing.** any of th
13990 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e IO operations 
139a0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
139b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
139c0 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61  unlock the.** da
139d0 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20  tabase then the 
139e0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
139f0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
13a00 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a   user. If the .*
13a10 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66  * operation to f
13a20 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13a30 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20  nal file fails, 
13a40 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74  then the code st
13a50 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20  ill.** tries to 
13a60 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
13a70 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20  ase file if not 
13a80 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13a90 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c  e. If the.** unl
13aa0 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  ock operation fa
13ab0 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65  ils as well, the
13ac0 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  n the first erro
13ad0 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a  r code related.*
13ae0 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
13af0 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
13b00 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69   (the journal fi
13b10 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20  nalization one) 
13b20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
13b30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
13b40 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
13b50 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
13b60 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
13b70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
13b80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13b90 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72  E_OK;      /* Er
13ba0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f  ror code from jo
13bb0 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
13bc0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
13bd0 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
13be0 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72  TE_OK;     /* Er
13bf0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62  ror code from db
13c00 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65   file unlock ope
13c10 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ration */..  /* 
13c20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68  Do nothing if th
13c30 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
13c40 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
13c50 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite transaction.
13c60 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74    ** or at least
13c70 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13c80 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
13c90 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  may be called wh
13ca0 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  en there.  ** is
13cb0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
13cc0 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74  ction active but
13cd0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
13ce0 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20  reater lock is. 
13cf0 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74   ** held under t
13d00 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
13d10 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
13d20 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73   After a success
13d30 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ful hot-journal 
13d40 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
13d50 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  called with.  **
13d60 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41        eState==PA
13d70 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f  GER_NONE and eLo
13d80 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
13d90 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  CK..  **.  **   
13da0 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69  2. If a connecti
13db0 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  on with locking_
13dc0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68  mode=exclusive h
13dd0 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
13de0 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c  IVE .  **      l
13df0 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63  ock switches bac
13e00 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  k to locking_mod
13e10 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65  e=normal and the
13e20 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a  n executes a.  *
13e30 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e  *      read-tran
13e40 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75  saction, this fu
13e50 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13e60 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41   with eState==PA
13e70 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a  GER_READER .  **
13e80 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d        and eLock=
13e90 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
13ea0 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72  when the read-tr
13eb0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f  ansaction is clo
13ec0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  sed..  */.  asse
13ed0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
13ee0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
13ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13f00 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
13f10 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  R_ERROR );.  if(
13f20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
13f30 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
13f40 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65  KED && pPager->e
13f50 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f  Lock<RESERVED_LO
13f60 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
13f70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13f80 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
13f90 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
13fa0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
13fb0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
13fc0 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
13fd0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
13fe0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13ff0 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
14000 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
14010 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
14020 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
14030 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
14040 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
14050 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f  3JournalIsInMemo
14060 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  ry(pPager->jfd) 
14070 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  ){.      /* asse
14080 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14090 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
140a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
140b0 59 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71  Y ); */.      sq
140c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
140d0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
140e0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
140f0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14100 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14110 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
14120 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
14130 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
14140 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
14150 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
14160 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
14170 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
14180 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
14190 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
141a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
141b0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
141c0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
141d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
141e0 6e 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73  new file size is
141f0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
14200 65 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77  e inode right aw
14210 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ay..          **
14220 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6a   Otherwise the j
14230 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73  ournal might res
14240 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67  urrect following
14250 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e   a power loss an
14260 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
14270 61 75 73 65 20 74 68 65 20 6c 61 73 74 20 74 72  ause the last tr
14280 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c  ansaction to rol
14290 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20  l back.  See.   
142a0 20 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a         ** https:
142b0 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c  //bugzilla.mozil
142c0 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e  la.org/show_bug.
142d0 63 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20  cgi?id=1072773. 
142e0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
142f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14300 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
14310 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
14320 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
14330 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14340 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14350 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
14360 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
14370 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14380 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
14390 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20  ERSIST.      || 
143a0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
143b0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
143c0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
143d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
143e0 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20  _WAL).    ){.   
143f0 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
14400 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
14410 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
14420 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14430 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
14440 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  se{.      /* Thi
14450 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20  s branch may be 
14460 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61  executed with Pa
14470 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  ger.journalMode=
14480 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20  =MEMORY if.     
14490 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
144a0 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65  l was just rolle
144b0 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  d back. In this 
144c0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
144d0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73  .      ** file s
144e0 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
144f0 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20  and deleted. If 
14500 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
14510 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20  writes to.      
14520 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14530 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f  file, it will do
14540 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d   so using an in-
14550 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
14560 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
14570 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 21 70 50  nt bDelete = !pP
14580 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
14590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
145a0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
145b0 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a  Memory(pPager->j
145c0 66 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  fd)==0 );.      
145d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
145e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
145f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
14600 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20  ELETE .         
14610 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
14620 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14630 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
14640 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  RY .           |
14650 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
14660 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14670 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
14680 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
14690 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
146a0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
146b0 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20  if( bDelete ){. 
146c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
146d0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
146e0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
146f0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
14700 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a  er->extraSync);.
14710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14720 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
14730 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73  _CHECK_PAGES.  s
14740 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
14750 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
14760 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
14770 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20  set_pagehash);. 
14780 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
14790 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  ize==0 && sqlite
147a0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
147b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
147c0 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  >0 ){.    PgHdr 
147d0 2a 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  *p = sqlite3Page
147e0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
147f0 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  1);.    if( p ){
14800 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61  .      p->pageHa
14810 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  sh = 0;.      sq
14820 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
14830 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d  otNull(p);.    }
14840 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
14850 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
14860 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
14870 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
14880 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
14890 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
148a0 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  c = 0;.  if( pag
148b0 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28  erFlushOnCommit(
148c0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 73  pPager) ){.    s
148d0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
148e0 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
148f0 61 63 68 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ache);.  }else{.
14900 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
14910 65 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70  eClearWritable(p
14920 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
14930 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 63  .  }.  sqlite3Pc
14940 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
14950 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
14960 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
14970 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
14980 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
14990 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
149a0 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
149b0 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
149c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
149d0 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
149e0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
149f0 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
14a00 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
14a10 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
14a20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
14a30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
14a40 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
14a50 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
14a60 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
14a70 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
14a80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
14a90 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
14aa0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
14ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
14ac0 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d  ommit && pPager-
14ad0 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67  >dbFileSize>pPag
14ae0 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
14af0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14b00 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63   is taken when c
14b10 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
14b20 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62  saction in rollb
14b30 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ack-journal.    
14b40 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64  ** mode if the d
14b50 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
14b60 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74  disk is larger t
14b70 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  han the database
14b80 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41   image..    ** A
14b90 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
14ba0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
14bb0 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
14bc0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14bd0 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
14be0 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ully committed, 
14bf0 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56  but the EXCLUSIV
14c00 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20  E lock is still 
14c10 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  held on the.    
14c20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69  ** file. So it i
14c30 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61  s safe to trunca
14c40 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
14c50 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  file to its mini
14c60 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  mum.    ** requi
14c70 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20  red size.  */.  
14c80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14c90 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
14ca0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  VE_LOCK );.    r
14cb0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
14cc0 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
14cd0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
14ce0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14cf0 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14d00 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
14d10 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20  ->fd) ){.    rc 
14d20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
14d30 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
14d40 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
14d50 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c  COMMIT_PHASETWO,
14d60 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
14d70 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
14d80 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
14d90 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
14da0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
14db0 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
14dc0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
14dd0 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
14de0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
14df0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
14e00 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
14e10 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
14e20 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
14e30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
14e40 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
14e50 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14e60 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
14e70 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
14e80 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14e90 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14ea0 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
14eb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
14ec0 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
14ed0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14ee0 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
14ef0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
14f00 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
14f10 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14f20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
14f30 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
14f40 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
14f50 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
14f60 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
14f70 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
14f80 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14f90 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14fa0 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14fb0 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
14fc0 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
14fd0 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
14fe0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14ff0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
15000 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
15010 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
15020 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
15030 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
15040 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
15050 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
15060 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
15070 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
15080 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
15090 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
150a0 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
150b0 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
150c0 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
150d0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
150e0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
150f0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
15100 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
15110 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
15120 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
15130 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
15140 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
15150 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
15160 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
15170 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
15180 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
15190 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
151a0 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
151b0 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
151c0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
151d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
151e0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
151f0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
15200 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
15210 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
15220 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
15230 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
15240 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
15250 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
15260 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
15270 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
15280 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
15290 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
152a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
152b0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
152c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
152d0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
152e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
152f0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
15300 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
15310 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
15320 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
15330 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
15340 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
15350 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
15360 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
15370 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
15380 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
15390 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
153a0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
153b0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
153c0 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
153d0 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
153e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
153f0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
15400 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
15410 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
15420 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
15430 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
15440 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
15450 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15460 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
15470 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
15480 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
15490 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
154a0 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
154b0 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
154c0 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
154d0 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
154e0 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
154f0 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
15500 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
15510 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
15520 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
15530 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
15540 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
15550 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
15560 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
15570 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
15580 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
15590 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
155a0 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
155b0 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
155c0 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
155d0 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
155e0 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
155f0 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
15600 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
15610 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
15620 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
15630 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
15640 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
15650 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
15660 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
15670 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
15680 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
15690 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
156a0 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
156b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
156c0 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
156d0 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
156e0 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
156f0 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
15700 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
15710 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
15720 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
15730 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
15740 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
15750 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
15760 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
15770 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
15780 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
15790 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
157a0 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
157b0 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
157c0 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
157d0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
157e0 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
157f0 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
15800 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15810 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
15820 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
15830 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
15840 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
15850 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
15860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
15870 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
15880 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
15890 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
158a0 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
158b0 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
158c0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
158d0 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
158e0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
158f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15900 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
15910 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
15920 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
15930 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
15940 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
15950 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15970 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
15980 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
15990 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
159a0 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
159b0 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
159c0 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
159d0 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
159e0 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69  ec */.#endif..#i
159f0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
15a00 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  CODEC./*.** Make
15a10 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72   sure the number
15a20 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74   of reserved bit
15a30 73 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e  s is the same in
15a40 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
15a50 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20  .** pager as it 
15a60 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  is in the source
15a70 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70  .  This comes up
15a80 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63   when a VACUUM c
15a90 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75  hanges the.** nu
15aa0 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
15ab0 20 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70   bits to the "op
15ac0 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a  timal" amount..*
15ad0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
15ae0 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28  gerAlignReserve(
15af0 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61  Pager *pDest, Pa
15b00 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66  ger *pSrc){.  if
15b10 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76  ( pDest->nReserv
15b20 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76  e!=pSrc->nReserv
15b30 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e  e ){.    pDest->
15b40 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d  nReserve = pSrc-
15b50 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  >nReserve;.    p
15b60 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
15b70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Dest);.  }.}.#en
15b80 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
15b90 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
15ba0 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
15bb0 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
15bc0 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
15bd0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
15be0 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
15bf0 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
15c00 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
15c10 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
15c20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
15c30 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
15c40 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
15c50 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
15c60 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
15c70 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
15c80 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
15c90 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
15ca0 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
15cb0 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63  k journal uses c
15cc0 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
15cd0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
15ce0 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a   does .** not..*
15cf0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
15d00 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
15d10 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
15d20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
15d30 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
15d40 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
15d50 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
15d60 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
15d70 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
15d80 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
15d90 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
15da0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
15db0 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
15dc0 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
15dd0 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
15de0 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
15df0 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
15e00 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
15e10 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
15e20 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
15e30 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
15e40 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
15e50 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
15e60 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
15e70 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
15e80 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
15e90 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
15ea0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
15eb0 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
15ec0 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
15ed0 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
15ee0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
15ef0 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
15f00 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
15f10 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15f20 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
15f30 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
15f40 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15f50 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
15f60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
15f70 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
15f80 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
15f90 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
15fa0 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
15fb0 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
15fc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
15fd0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
15fe0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
15ff0 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
16000 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
16010 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
16020 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
16030 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
16040 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
16050 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
16060 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
16070 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
16080 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
16090 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
160a0 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
160b0 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
160c0 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
160d0 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
160e0 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
160f0 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
16100 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
16110 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
16120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
16130 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
16140 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
16150 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
16160 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
16170 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
16180 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
16190 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
161a0 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
161b0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
161c0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
161d0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
161e0 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
161f0 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
16200 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
16210 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
16220 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
16230 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
16240 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
16250 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
16260 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
16270 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
16280 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
16290 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
162a0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
162b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
162c0 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
162d0 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
162e0 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16300 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
16310 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
16320 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
16350 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
16360 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
16370 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
16380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
16390 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
163a0 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
163b0 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
163c0 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
163d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
163e0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
163f0 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
16400 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
16410 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
16420 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
16430 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
16440 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
16450 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
16460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16470 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16480 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
16490 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
164a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
164b0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
164c0 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
164d0 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
164e0 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
164f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16500 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
16510 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
16520 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
16530 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
16540 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
16550 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
16560 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
16570 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16590 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
165a0 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
165b0 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
165c0 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29   (isMainJrnl&~1)
165d0 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69  ==0 );      /* i
165e0 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f  sMainJrnl is 0 o
165f0 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
16600 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d   (isSavepnt&~1)=
16610 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69  =0 );       /* i
16620 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72  sSavepnt is 0 or
16630 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
16640 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44  isMainJrnl || pD
16650 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44  one );     /* pD
16660 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20  one always used 
16670 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  on sub-journals 
16680 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
16690 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d  avepnt || pDone=
166a0 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65  =0 );   /* pDone
166b0 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e   never used on n
166c0 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  on-savepoint */.
166d0 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65  .  aData = pPage
166e0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
166f0 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
16700 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
16710 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
16720 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
16730 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61  allocated */.  a
16740 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
16750 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
16760 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26   (!isMainJrnl &&
16770 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a   isSavepnt) );..
16780 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
16790 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72  state is greater
167a0 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54   than PAGER_WRIT
167b0 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74  ER_CACHEMOD (a t
167c0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
167d0 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f   or savepoint ro
167e0 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74  llback done at t
167f0 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68  he request of th
16800 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69  e caller) or thi
16810 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  s is.  ** a hot-
16820 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
16830 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74  . If it is a hot
16840 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
16850 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  k, the pager.  *
16860 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50  * is in state OP
16870 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20  EN and holds an 
16880 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
16890 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  Hot-journal roll
168a0 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72  back.  ** only r
168b0 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  eads from the ma
168c0 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20  in journal, not 
168d0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
168e0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
168f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
16900 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
16910 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
16920 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
16930 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70  =PAGER_OPEN && p
16940 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
16950 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
16960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
16970 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
16980 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
16990 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c  OD || isMainJrnl
169a0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
169b0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
169c0 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
169d0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
169e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
169f0 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
16a00 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
16a10 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
16a20 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
16a30 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
16a40 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
16a50 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
16a60 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
16a70 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
16a80 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
16a90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16aa0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
16ab0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16ac0 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
16ad0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
16ae0 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
16af0 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
16b00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
16b10 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
16b20 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
16b30 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
16b40 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
16b50 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
16b60 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
16b70 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
16b80 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
16b90 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
16ba0 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
16bb0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
16bc0 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
16bd0 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
16be0 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
16bf0 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
16c00 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
16c10 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
16c20 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
16c30 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
16c40 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
16c50 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
16c60 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
16c70 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
16c80 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
16c90 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
16ca0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
16cb0 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
16cc0 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
16cd0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
16ce0 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
16cf0 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
16d00 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
16d10 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
16d20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
16d30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16d40 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
16d50 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
16d60 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
16d70 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
16d80 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
16d90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
16da0 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
16db0 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
16dc0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
16dd0 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
16de0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16df0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
16e00 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
16e10 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
16e20 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  y been played ba
16e30 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  ck before during
16e40 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
16e50 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
16e60 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
16e70 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
16e80 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
16e90 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
16ea0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
16eb0 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
16ec0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16ed0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
16ee0 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
16ef0 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72  g back page 1, r
16f00 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65  estore the nRese
16f10 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  rve setting.  */
16f20 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26  .  if( pgno==1 &
16f30 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  & pPager->nReser
16f40 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29  ve!=((u8*)aData)
16f50 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67  [20] ){.    pPag
16f60 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
16f70 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b  (u8*)aData)[20];
16f80 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
16f90 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
16fa0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
16fb0 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45  ager is in CACHE
16fc0 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  MOD state, then 
16fd0 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
16fe0 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
16ff0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
17000 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
17010 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
17020 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
17030 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
17040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17050 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
17060 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
17070 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
17080 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
17090 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
170a0 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
170b0 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
170c0 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
170d0 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
170e0 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
170f0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
17100 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
17110 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
17120 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
17130 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
17140 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
17150 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
17160 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
17170 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
17180 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
17190 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
171a0 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
171b0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
171c0 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
171d0 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
171e0 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
171f0 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
17200 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44  * If in WRITER_D
17210 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e  BMOD, WRITER_FIN
17220 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74  ISHED or OPEN st
17230 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
17240 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ate the.  ** pag
17250 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
17260 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61  xists and the ma
17270 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
17280 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
17290 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79   .  ** not dirty
172a0 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64  . Since this cod
172b0 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74  e is only execut
172c0 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ed in PAGER_OPEN
172d0 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20   state for.  ** 
172e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
172f0 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75  llback, it is gu
17300 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
17310 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20  e page-cache is 
17320 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68  empty.  ** if th
17330 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50  e pager is in OP
17340 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20  EN state..  **. 
17350 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
17360 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
17370 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
17380 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
17390 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
173a0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
173b0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
173c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
173d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
173e0 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
173f0 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
17400 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
17410 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
17420 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
17430 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
17440 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
17450 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
17460 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
17470 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
17480 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
17490 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
174a0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
174b0 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
174c0 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
174d0 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
174e0 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
174f0 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
17500 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
17510 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
17520 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
17530 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
17540 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
17550 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
17560 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
17570 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
17580 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
17590 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
175a0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
175b0 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
175c0 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
175d0 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
175e0 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
175f0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
17600 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
17610 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
17620 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
17630 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
17640 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
17650 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
17660 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
17670 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
17680 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
17690 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
176a0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
176b0 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
176c0 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
176d0 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
176e0 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
176f0 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
17700 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
17710 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
17720 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
17730 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
17740 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
17750 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
17760 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
17770 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
17780 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
17790 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
177a0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
177b0 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
177c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
177d0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
177e0 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
177f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
17800 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
17810 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
17820 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  no);.  }.  asser
17830 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42  t( pPg || !MEMDB
17840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17850 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
17860 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d  GER_OPEN || pPg=
17870 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
17880 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50 41 47 45  mpFile );.  PAGE
17890 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43  RTRACE(("PLAYBAC
178a0 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  K %d page %d has
178b0 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20  h(%08x) %s\n",. 
178c0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
178d0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
178e0 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
178f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17900 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20  , (u8*)aData),. 
17910 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69            (isMai
17920 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72  nJrnl?"main-jour
17930 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61  nal":"sub-journa
17940 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  l").  ));.  if( 
17950 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
17960 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61    isSynced = pPa
17970 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28  ger->noSync || (
17980 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67  *pOffset <= pPag
17990 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
179a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
179b0 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30  Synced = (pPg==0
179c0 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
179d0 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f  gs & PGHDR_NEED_
179e0 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66  SYNC));.  }.  if
179f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
17a00 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50 61 67  >fd).   && (pPag
17a10 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
17a20 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
17a30 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
17a40 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20  ==PAGER_OPEN).  
17a50 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29   && isSynced.  )
17a60 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d  {.    i64 ofst =
17a70 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
17a80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
17a90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21  .    testcase( !
17aa0 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67  isSavepnt && pPg
17ab0 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61  !=0 && (pPg->fla
17ac0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
17ad0 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  NC)!=0 );.    as
17ae0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
17af0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
17b00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17b10 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
17b20 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70  , (u8 *)aData, p
17b30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
17b40 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20   ofst);.    if( 
17b50 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
17b60 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
17b70 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
17b80 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
17b90 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
17ba0 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
17bb0 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
17bc0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  , aData, pgno, 3
17bd0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
17be0 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20 20 73  M_BKPT);.      s
17bf0 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
17c00 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
17c10 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61  up, pgno, (u8*)a
17c20 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44  Data);.      COD
17c30 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
17c40 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
17c50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
17c60 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  , aData);.    }.
17c70 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
17c80 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
17c90 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
17ca0 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
17cb0 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
17cc0 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
17cd0 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
17ce0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
17cf0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
17d00 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
17d10 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
17d20 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
17d30 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
17d40 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
17d50 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
17d60 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
17d70 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
17d80 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
17d90 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
17da0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
17db0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
17dc0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
17dd0 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
17de0 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
17df0 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
17e00 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
17e10 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
17e20 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
17e30 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
17e40 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
17e50 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
17e60 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
17e70 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
17e80 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
17e90 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
17ea0 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
17eb0 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
17ec0 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
17ed0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
17ee0 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
17ef0 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
17f00 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
17f10 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
17f20 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
17f30 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
17f40 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
17f50 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
17f60 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
17f70 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
17f80 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
17f90 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
17fa0 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
17fb0 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17fc0 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
17fd0 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
17fe0 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
17ff0 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
18000 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
18010 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73  vepnt );.    ass
18020 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f  ert( (pPager->do
18030 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
18040 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d  FLAG_ROLLBACK)==
18050 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
18060 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
18070 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
18080 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  K;.    rc = sqli
18090 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
180a0 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
180b0 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
180c0 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
180d0 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
180e0 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a  ROLLBACK)!=0 );.
180f0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
18100 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
18110 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
18120 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18130 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
18140 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
18150 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
18160 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
18170 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
18180 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
18190 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
181a0 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
181b0 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
181c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
181d0 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
181e0 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
181f0 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
18200 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
18210 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
18220 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
18230 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
18240 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
18250 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
18260 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
18270 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
18280 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
18290 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
182a0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
182b0 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
182c0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
182d0 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
182e0 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
182f0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
18300 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
18310 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
18320 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
18330 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
18340 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
18350 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
18360 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
18370 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
18380 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
18390 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
183a0 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
183b0 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
183c0 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
183d0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
183e0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
183f0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
18400 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
18410 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
18420 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
18430 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
18440 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
18450 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
18460 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
18470 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
18480 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
18490 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
184a0 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
184b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
184c0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
184d0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
184e0 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
184f0 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
18500 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
18510 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
18520 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
18530 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
18540 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
18550 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
18560 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
18570 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
18580 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
18590 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
185a0 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
185b0 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
185c0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
185d0 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
185e0 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
185f0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
18600 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
18610 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
18620 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
18630 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
18640 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
18650 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
18660 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
18670 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
18680 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
18690 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
186a0 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
186b0 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
186c0 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
186d0 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
186e0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
186f0 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
18700 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
18710 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
18720 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
18730 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
18740 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
18750 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
18760 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
18770 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
18780 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
18790 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
187a0 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
187b0 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
187c0 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
187d0 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
187e0 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
187f0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
18800 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
18810 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
18820 20 2a 2a 20 55 70 64 61 74 65 3a 20 41 6e 6f 74   ** Update: Anot
18830 68 65 72 20 65 78 63 65 70 74 69 6f 6e 20 69 73  her exception is
18840 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
18850 74 68 61 74 20 61 72 65 20 6e 6f 74 20 0a 20 20  that are not .  
18860 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79      ** in-memory
18870 20 64 61 74 61 62 61 73 65 73 2e 20 49 6e 20 74   databases. In t
18880 68 69 73 20 63 61 73 65 20 74 68 65 20 70 61 67  his case the pag
18890 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
188a0 64 69 72 74 79 0a 20 20 20 20 20 20 2a 2a 20 61  dirty.      ** a
188b0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
188c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
188d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
188e0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
188f0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
18900 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
18910 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 73  >tempFile==0 ) s
18920 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
18930 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
18940 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
18950 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a  pagehash(pPg);..
18960 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
18970 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
18980 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
18990 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
189a0 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
189b0 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
189c0 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
189d0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
189e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
189f0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
18a00 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
18a10 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
18a20 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
18a30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18a40 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
18a50 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
18a60 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
18a70 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
18a80 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
18a90 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
18aa0 4b 50 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  KPT);.    sqlite
18ab0 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
18ac0 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
18ad0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
18ae0 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
18af0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
18b00 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
18b10 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
18b20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
18b30 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
18b40 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18b50 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
18b60 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
18b70 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
18b80 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
18b90 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
18ba0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
18bb0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
18bc0 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
18bd0 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
18be0 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
18bf0 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
18c00 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
18c10 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
18c20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
18c30 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
18c40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
18c50 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
18c60 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18c70 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
18c80 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
18c90 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
18ca0 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
18cb0 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
18cc0 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
18cd0 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
18ce0 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
18cf0 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
18d00 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
18d10 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
18d20 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
18d30 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
18d40 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
18d50 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
18d60 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
18d70 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
18d80 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
18d90 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
18da0 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
18db0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
18dc0 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
18dd0 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
18de0 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
18df0 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
18e00 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18e10 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
18e20 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
18e30 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
18e40 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
18e50 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
18e60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
18e70 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
18e80 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
18e90 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
18ea0 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
18eb0 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
18ec0 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
18ed0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
18ee0 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
18ef0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
18f00 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
18f10 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
18f20 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
18f30 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
18f40 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
18f50 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
18f60 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
18f70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18f80 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
18f90 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
18fa0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
18fb0 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
18fc0 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
18fd0 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
18fe0 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
18ff0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
19000 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
19010 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
19020 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
19030 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
19040 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
19050 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
19060 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
19070 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
19080 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
19090 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
190a0 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
190b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
190c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
190d0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
190e0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
190f0 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
19100 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
19110 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
19120 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
19130 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
19140 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
19150 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
19160 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
19170 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
19180 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
19190 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
191a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
191b0 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
191c0 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
191d0 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
191e0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
191f0 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
19200 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
19210 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
19220 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
19230 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
19240 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
19250 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
19260 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
19270 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
19280 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
19290 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
192a0 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
192b0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
192c0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
192d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
192e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
192f0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
19300 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
19310 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
19320 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
19330 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19340 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
19350 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
19360 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
19370 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
19380 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
19390 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
193a0 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
193b0 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
193c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
193d0 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
193e0 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
193f0 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
19400 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
19410 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
19420 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
19430 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
19440 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
19450 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
19460 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
19470 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
19480 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
19490 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
194a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
194b0 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
194c0 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
194d0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
194e0 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
194f0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
19500 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
19510 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
19520 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
19530 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
19540 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
19550 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
19560 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
19570 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
19580 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
19590 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
195a0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
195b0 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
195c0 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
195d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
195e0 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
195f0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
19600 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
19610 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19620 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
19630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
19640 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
19650 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
19660 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
19670 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
19680 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19690 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
196a0 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
196b0 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
196c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
196d0 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
196e0 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c  ter_out;..  /* L
196f0 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
19700 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19710 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
19720 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a  tained from.  **
19730 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
19740 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
19750 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
19760 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69  al.   Also obtai
19770 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e  n.  ** sufficien
19780 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73  t space (in zMas
19790 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20  terPtr) to hold 
197a0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73  the names of mas
197b0 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ter.  ** journal
197c0 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64   files extracted
197d0 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f   from regular ro
197e0 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e  llback-journals.
197f0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
19800 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
19810 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
19820 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
19830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19840 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19850 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72  ut;.  nMasterPtr
19860 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
19870 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72  ame+1;.  zMaster
19880 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
19890 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  3Malloc(nMasterJ
198a0 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
198b0 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20  Ptr + 1);.  if( 
198c0 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
198d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
198e0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
198f0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
19900 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61  r_out;.  }.  zMa
19910 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74  sterPtr = &zMast
19920 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
19930 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72  rJournal+1];.  r
19940 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
19950 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(pMaster, zMast
19960 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29  erJournal, (int)
19970 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
19980 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
19990 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
199a0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
199b0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
199c0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d  MasterJournal] =
199d0 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20   0;..  zJournal 
199e0 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
199f0 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75  ;.  while( (zJou
19a00 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
19a10 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
19a20 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  nal ){.    int e
19a30 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20  xists;.    rc = 
19a40 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
19a50 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
19a60 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
19a70 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
19a80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
19aa0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
19ab0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
19ac0 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
19ad0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
19ae0 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
19af0 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
19b00 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
19b10 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69  .      ** Open i
19b20 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
19b30 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
19b40 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
19b50 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  If.      ** so, 
19b60 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
19b70 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
19b80 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
19b90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19ba0 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74  int c;.      int
19bb0 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
19bc0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
19bd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
19be0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
19bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
19c00 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  en(pVfs, zJourna
19c10 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61  l, pJournal, fla
19c20 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  gs, 0);.      if
19c30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19c40 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
19c50 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
19c60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63       }..      rc
19c70 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
19c80 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
19c90 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
19ca0 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71  erPtr);.      sq
19cb0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f  lite3OsClose(pJo
19cc0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  urnal);.      if
19cd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19ce0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
19cf0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
19d00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20       }..      c 
19d10 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
19d20 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
19d30 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
19d40 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20  )==0;.      if( 
19d50 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  c ){.        /* 
19d60 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
19d70 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
19d80 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19d90 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
19da0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
19db0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
19dc0 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61     }.    zJourna
19dd0 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72  l += (sqlite3Str
19de0 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b  len30(zJournal)+
19df0 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69  1);.  }. .  sqli
19e00 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
19e10 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  er);.  rc = sqli
19e20 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
19e30 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
19e40 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
19e50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
19e60 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
19e70 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a   if( pMaster ){.
19e80 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
19e90 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  se(pMaster);.   
19ea0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
19eb0 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20  (pJournal) );.  
19ec0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
19ed0 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72  Master);.  }.  r
19ee0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
19ef0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19f00 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61  n is used to cha
19f10 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73  nge the actual s
19f20 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
19f30 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20  ase .** file in 
19f40 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
19f50 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
19f60 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ns when committi
19f70 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
19f80 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  ,.** or rolling 
19f90 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
19fa0 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f  on (including ro
19fb0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
19fc0 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a  -journal)..**.**
19fd0 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   If the main dat
19fe0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
19ff0 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70  t open, or the p
1a000 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
1a010 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f  ither.** DBMOD o
1a020 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
1a030 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1a040 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
1a050 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20  e, the size .** 
1a060 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  of the file is c
1a070 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20  hanged to nPage 
1a080 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61  pages (nPage*pPa
1a090 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
1a0a0 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65  tes). .** If the
1a0b0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
1a0c0 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65   currently large
1a0d0 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67  r than nPage pag
1a0e0 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65  es, then use the
1a0f0 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74   VFS.** xTruncat
1a100 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72  e() method to tr
1a110 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  uncate it..**.**
1a120 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65   Or, it might be
1a130 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
1a140 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
1a150 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
1a160 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
1a170 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
1a180 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
1a190 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
1a1a0 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
1a1b0 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
1a1c0 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
1a1d0 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
1a1e0 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
1a1f0 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
1a200 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
1a210 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
1a220 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
1a230 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
1a240 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
1a250 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
1a260 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
1a270 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
1a280 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1a290 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
1a2a0 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
1a2b0 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
1a2c0 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
1a2d0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
1a2e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1a2f0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
1a300 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1a310 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
1a320 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a330 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a340 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
1a350 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
1a360 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1a370 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
1a380 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
1a390 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
1a3a0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
1a3b0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
1a3c0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
1a3d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1a3e0 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
1a3f0 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
1a400 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
1a410 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
1a420 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1a430 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a440 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
1a450 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
1a460 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
1a470 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
1a480 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
1a490 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
1a4a0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1a4b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
1a4c0 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
1a4d0 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
1a4e0 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
1a4f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a500 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
1a510 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
1a520 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
1a530 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
1a540 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1a550 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
1a560 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
1a570 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
1a580 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
1a590 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
1a5a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
1a5b0 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
1a5c0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
1a5d0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
1a5e0 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
1a5f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a600 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
1a610 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
1a620 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1a630 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
1a640 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
1a650 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
1a660 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1a670 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
1a680 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
1a690 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
1a6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a6b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a6c0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1a6d0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
1a6e0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
1a6f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a700 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1a710 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64  turn a sanitized
1a720 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
1a730 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f  sector-size of O
1a740 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68  S file pFile. Th
1a750 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
1a760 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
1a770 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33  to lie between 3
1a780 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52  2 and MAX_SECTOR
1a790 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _SIZE..*/.int sq
1a7a0 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
1a7b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1a7c0 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74  ile){.  int iRet
1a7d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
1a7e0 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20  orSize(pFile);. 
1a7f0 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a   if( iRet<32 ){.
1a800 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a      iRet = 512;.
1a810 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74    }else if( iRet
1a820 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
1a830 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a840 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
1a850 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74  =512 );.    iRet
1a860 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
1a870 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
1a880 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iRet;.}../*.** 
1a890 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
1a8a0 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
1a8b0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
1a8c0 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
1a8d0 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
1a8e0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
1a8f0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
1a900 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
1a910 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
1a920 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
1a930 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
1a940 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65  e used .** to de
1a950 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
1a960 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f   and alignment o
1a970 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
1a980 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20   and .** master 
1a990 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
1a9a0 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20   within created 
1a9b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
1a9c0 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
1a9d0 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66  ry files the eff
1a9e0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1a9f0 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32  ze is always 512
1aa00 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   bytes..**.** Ot
1aa10 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e  herwise, for non
1aa20 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73  -temporary files
1aa30 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  , the effective 
1aa40 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a  sector size is.*
1aa50 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  * the value retu
1aa60 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
1aa70 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64  torSize() method
1aa80 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33   rounded up to 3
1aa90 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65  2 if.** it is le
1aaa0 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72  ss than 32, or r
1aab0 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d  ounded down to M
1aac0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
1aad0 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  f it.** is great
1aae0 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54  er than MAX_SECT
1aaf0 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49  OR_SIZE..**.** I
1ab00 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74  f the file has t
1ab10 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
1ab20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1ab30 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68  ITE property, th
1ab40 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66  en set.** the ef
1ab50 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1ab60 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ize to its minim
1ab70 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20  um value (512). 
1ab80 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a   The purpose of.
1ab90 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ** pPager->secto
1aba0 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69  rSize is to defi
1abb0 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61  ne the "blast ra
1abc0 64 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74  dius" of bytes t
1abd0 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
1abe0 6e 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f  nge if a crash o
1abf0 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74  ccurs while writ
1ac00 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ing to a single 
1ac10 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20  byte in.** that 
1ac20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68  range.  But with
1ac30 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1ac40 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20  RITE, the blast 
1ac50 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a  radius is zero.*
1ac60 2a 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20  * (that is what 
1ac70 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1ac80 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77  ITE means), so w
1ac90 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73  e minimize the s
1aca0 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20  ector.** size.  
1acb0 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f  For backwards co
1acc0 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74  mpatibility of t
1acd0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1ace0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c  nal file format,
1acf0 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65  .** we cannot re
1ad00 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
1ad10 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62  ve sector size b
1ad20 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61  elow 512..*/.sta
1ad30 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
1ad40 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
1ad50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
1ad60 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1ad70 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1ad80 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66  empFile );..  if
1ad90 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
1ada0 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  le.   || (sqlite
1adb0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1adc0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1add0 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20  >fd) & .        
1ade0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1adf0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1ae00 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a  RWRITE)!=0.  ){.
1ae10 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
1ae20 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
1ae30 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
1ae40 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
1ae50 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
1ae60 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
1ae70 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
1ae80 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
1ae90 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
1aea0 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
1aeb0 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50  fault. */.    pP
1aec0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1aed0 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b   = 512;.  }else{
1aee0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
1aef0 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
1af00 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  3SectorSize(pPag
1af10 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  er->fd);.  }.}..
1af20 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
1af30 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
1af40 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
1af50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1af60 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
1af70 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
1af80 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
1af90 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
1afa0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1afb0 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
1afc0 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
1afd0 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
1afe0 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
1aff0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
1b000 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
1b010 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1b020 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1b030 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
1b040 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
1b050 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
1b060 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
1b070 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
1b080 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
1b090 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
1b0a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
1b0b0 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
1b0c0 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
1b0d0 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
1b0e0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1b0f0 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
1b100 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
1b110 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
1b120 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
1b130 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
1b140 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1b150 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1b160 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
1b170 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
1b180 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
1b190 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
1b1a0 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  5)  4 byte big-e
1b1b0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1b1c0 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f  ich is the secto
1b1d0 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61  r size.  The hea
1b1e0 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20  der.**       is 
1b1f0 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
1b200 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29  in size..**  (6)
1b210 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1b220 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1b230 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69  h is the page si
1b240 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72  ze..**  (7)  zer
1b250 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f  o padding out to
1b260 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
1b270 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20   size..**  (8)  
1b280 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
1b290 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
1b2a0 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
1b2b0 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1b2c0 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
1b2d0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
1b2e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
1b2f0 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
1b300 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1b310 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
1b320 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
1b330 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1b340 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
1b350 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61   first 7 items a
1b360 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
1b370 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
1b380 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
1b390 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65  e of the 8th ite
1b3a0 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
1b3b0 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
1b3c0 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
1b3d0 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
1b3e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
1b3f0 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
1b400 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
1b410 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
1b420 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
1b430 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
1b440 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
1b450 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
1b460 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
1b470 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
1b480 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
1b490 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
1b4a0 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
1b4b0 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
1b4c0 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
1b4d0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
1b4e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
1b4f0 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
1b500 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
1b510 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
1b520 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
1b530 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
1b540 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
1b550 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
1b560 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
1b570 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
1b580 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
1b590 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
1b5a0 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
1b5b0 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
1b5c0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1b5d0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
1b5e0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
1b5f0 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
1b600 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
1b610 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
1b620 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
1b630 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
1b640 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
1b650 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
1b660 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
1b670 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
1b680 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1b690 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
1b6a0 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
1b6b0 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
1b6c0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
1b6d0 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
1b6e0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1b6f0 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
1b700 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
1b710 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
1b720 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
1b730 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
1b740 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
1b750 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
1b760 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
1b770 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
1b780 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
1b790 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
1b7a0 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
1b7b0 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
1b7c0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
1b7d0 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
1b7e0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
1b7f0 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
1b800 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
1b810 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
1b820 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
1b830 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
1b840 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
1b850 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
1b860 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
1b870 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
1b880 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
1b890 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
1b8a0 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
1b8b0 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
1b8c0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1b8d0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
1b8e0 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65  e isHot paramete
1b8f0 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  r indicates that
1b900 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
1b910 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75  o rollback a jou
1b920 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67  rnal.** that mig
1b930 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72  ht be a hot jour
1b940 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75  nal.  Or, it cou
1b950 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a  ld be that the j
1b960 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72  ournal is .** pr
1b970 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20  eserved because 
1b980 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  of JOURNALMODE_P
1b990 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41  ERSIST or JOURNA
1b9a0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a  LMODE_TRUNCATE..
1b9b0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
1b9c0 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c  l really is hot,
1b9d0 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72   reset the pager
1b9e0 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c   cache prior rol
1b9f0 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79  ling.** back any
1ba00 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68   content.  If th
1ba10 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72  e journal is mer
1ba20 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20  ely persistent, 
1ba30 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e  no reset is.** n
1ba40 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
1ba50 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
1ba60 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1ba70 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
1ba80 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1ba90 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1baa0 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bac0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
1bad0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
1bae0 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
1baf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bb00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
1bb10 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
1bb20 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb40 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
1bb50 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1bb60 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
1bb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1bb80 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
1bb90 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
1bba0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bbc0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
1bbd0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
1bbe0 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
1bbf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1bc00 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1bc10 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1bc20 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  ) */.  char *zMa
1bc30 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
1bc40 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
1bc50 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
1bc60 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  f any */.  int n
1bc70 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20  eedPagerReset;  
1bc80 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
1bc90 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20  eset page prior 
1bca0 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f  to first page ro
1bcb0 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  llback */.  int 
1bcc0 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20  nPlayback = 0;  
1bcd0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
1bce0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65  mber of pages re
1bcf0 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72  stored from jour
1bd00 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  nal */..  /* Fig
1bd10 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1bd20 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
1bd30 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
1bd40 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
1bd50 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
1bd60 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
1bd70 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1bd80 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
1bd90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1bda0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1bdb0 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
1bdc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bdd0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1bde0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
1bdf0 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
1be00 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
1be10 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1be20 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
1be30 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
1be40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1be50 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
1be60 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
1be70 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
1be80 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
1be90 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1bea0 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
1beb0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1bec0 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
1bed0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
1bee0 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
1bef0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
1bf00 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
1bf10 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
1bf20 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
1bf30 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
1bf40 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
1bf50 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
1bf60 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
1bf70 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
1bf80 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
1bf90 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1bfa0 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
1bfb0 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68 6e  .c,.  ** mxPathn
1bfc0 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
1bfd0 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
1bfe0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
1bff0 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
1c000 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
1c010 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
1c020 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1c030 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
1c040 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1c050 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1c060 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1c070 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1c080 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c090 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1c0a0 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
1c0b0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
1c0c0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
1c0d0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1c0e0 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
1c0f0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
1c100 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c110 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
1c120 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c130 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
1c140 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1c150 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
1c160 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
1c170 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
1c180 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
1c190 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
1c1a0 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
1c1b0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1c1c0 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
1c1d0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1c1e0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
1c1f0 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
1c200 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
1c210 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
1c220 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
1c230 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
1c240 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
1c250 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
1c260 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
1c270 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
1c280 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1c290 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
1c2a0 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
1c2b0 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
1c2c0 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
1c2d0 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68  t have failed wh
1c2e0 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
1c2f0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
1c300 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
1c310 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
1c320 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
1c330 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
1c340 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1c350 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
1c360 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
1c370 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c380 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
1c390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1c3a0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
1c3b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c3c0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1c3d0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c3e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1c3f0 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
1c400 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
1c410 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
1c420 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
1c430 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
1c440 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
1c450 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1c460 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
1c470 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
1c480 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
1c490 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
1c4a0 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
1c4b0 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
1c4c0 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1c4d0 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
1c4e0 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
1c4f0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1c500 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
1c510 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
1c520 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1c530 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1c540 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1c550 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
1c560 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
1c570 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1c580 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
1c590 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1c5a0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1c5b0 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
1c5c0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
1c5d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
1c5e0 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
1c5f0 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
1c600 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1c610 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
1c620 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
1c630 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
1c640 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
1c650 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1c660 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
1c670 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
1c680 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
1c690 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
1c6a0 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
1c6b0 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
1c6c0 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
1c6d0 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
1c6e0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
1c6f0 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
1c700 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
1c710 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
1c720 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
1c730 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
1c740 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
1c750 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
1c760 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
1c770 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
1c780 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
1c790 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
1c7a0 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
1c7b0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1c7c0 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
1c7d0 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
1c7e0 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
1c7f0 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
1c800 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
1c810 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
1c820 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1c830 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1c840 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
1c850 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
1c860 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1c870 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
1c880 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1c890 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
1c8a0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1c8b0 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
1c8c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
1c8d0 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
1c8e0 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
1c8f0 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
1c900 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1c910 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1c920 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1c930 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
1c940 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1c950 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
1c960 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
1c970 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
1c980 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
1c990 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1c9a0 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
1c9b0 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
1c9c0 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
1c9d0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
1c9e0 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
1c9f0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1ca00 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1ca10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1ca20 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1ca30 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1ca40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1ca50 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1ca60 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
1ca70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ca80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ca90 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1caa0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1cab0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1cac0 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
1cad0 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
1cae0 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
1caf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1cb00 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a   back into the .
1cb10 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1cb20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65  file and/or page
1cb30 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
1cb40 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
1cb50 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
1cb60 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73  if( needPagerRes
1cb70 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  et ){.        pa
1cb80 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1cb90 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50  );.        needP
1cba0 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20  agerReset = 0;. 
1cbb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1cbc0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1cbd0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1cbe0 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
1cbf0 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20  lOff,0,1,0);.   
1cc00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cc10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1cc20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20  nPlayback++;.   
1cc30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cc40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cc50 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1cc60 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1cc70 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1cc80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1cc90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1cca0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1ccb0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1ccc0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1ccd0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1cce0 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1ccf0 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1cd00 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1cd10 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1cd20 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1cd30 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1cd40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1cd50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1cd60 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1cd70 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1cd80 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1cd90 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1cda0 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1cdb0 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1cdc0 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1cdd0 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1cde0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1cdf0 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1ce00 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1ce10 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1ce20 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1ce30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1ce40 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1ce50 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1ce60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ce70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1ce80 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1ce90 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1cea0 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1ceb0 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1cec0 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1ced0 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1cee0 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1cef0 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1cf00 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1cf10 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1cf20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1cf30 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1cf40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1cf50 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1cf60 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1cf70 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1cf80 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1cf90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1cfa0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1cfb0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1cfc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1cfd0 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1cfe0 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1cff0 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1d000 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
1d010 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
1d020 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1d030 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
1d040 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
1d050 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
1d060 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1d070 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
1d080 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
1d090 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1d0a0 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
1d0b0 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
1d0c0 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
1d0d0 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
1d0e0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1d0f0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
1d100 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64  ified..  */.#ifd
1d110 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1d120 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64    if( pPager->fd
1d130 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1d140 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
1d150 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
1d160 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
1d170 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
1d180 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
1d190 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61    /* If this pla
1d1a0 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69  yback is happeni
1d1b0 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ng automatically
1d1c0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1d1d0 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d  an IO or .  ** m
1d1e0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74  alloc error that
1d1f0 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20   occurred after 
1d200 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1d210 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62  er was updated b
1d220 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20  ut .  ** before 
1d230 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d240 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  was committed, t
1d250 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hen the change-c
1d260 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64  ounter .  ** mod
1d270 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75  ification may ju
1d280 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76  st have been rev
1d290 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68  erted. If this h
1d2a0 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73  appens in exclus
1d2b0 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20  ive .  ** mode, 
1d2c0 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
1d2d0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72  transactions per
1d2e0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f  formed by the co
1d2f0 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  nnection will no
1d300 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68  t.  ** update th
1d310 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d320 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61   at all. This ma
1d330 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20  y lead to cache 
1d340 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20  inconsistency.  
1d350 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  ** problems for 
1d360 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
1d370 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
1d380 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c   the future. So,
1d390 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61   just.  ** in ca
1d3a0 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  se this has happ
1d3b0 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20  ened, clear the 
1d3c0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1d3d0 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  flag now..  */. 
1d3e0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1d3f0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
1d400 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
1d410 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d420 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
1d430 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1d440 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
1d450 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1d460 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1d470 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1d480 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1d490 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
1d4a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d4b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1d4c0 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
1d4d0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1d4e0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1d4f0 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1d500 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1d510 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  EN).  ){.    rc 
1d520 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
1d530 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  nc(pPager, 0);. 
1d540 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1d550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1d560 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
1d570 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
1d580 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
1d590 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63  ', 0);.    testc
1d5a0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1d5b0 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1d5c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d5d0 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
1d5e0 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
1d5f0 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
1d600 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
1d610 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1d620 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
1d630 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
1d640 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
1d650 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1d660 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
1d670 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1d680 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
1d690 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
1d6a0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1d6b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1d6c0 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26 26 20  .  if( isHot && 
1d6d0 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20  nPlayback ){.   
1d6e0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
1d6f0 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
1d700 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65  ER_ROLLBACK, "re
1d710 63 6f 76 65 72 65 64 20 25 64 20 70 61 67 65 73  covered %d pages
1d720 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20   from %s",.     
1d730 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79             nPlay
1d740 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  back, pPager->zJ
1d750 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20  ournal);.  }..  
1d760 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
1d770 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
1d780 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
1d790 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
1d7a0 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
1d7b0 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
1d7c0 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
1d7d0 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
1d7e0 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
1d7f0 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
1d800 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
1d810 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
1d820 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
1d830 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
1d840 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
1d850 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
1d860 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72   the content for
1d870 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
1d880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d890 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20  le and into .** 
1d8a0 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68  pPg->pData. A sh
1d8b0 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65  ared lock or gre
1d8c0 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
1d8d0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1d8e0 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65  e.** file before
1d8f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1d900 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
1d910 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61  If page 1 is rea
1d920 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  d, then the valu
1d930 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
1d940 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74  eVers[] is set t
1d950 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  o.** the value r
1d960 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
1d970 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1d980 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
1d990 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
1d9a0 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65  e IO error is re
1d9b0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1d9c0 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  ller..** Otherwi
1d9d0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
1d9e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1d9f0 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
1da00 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20  age(PgHdr *pPg, 
1da10 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50  u32 iFrame){.  P
1da20 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1da30 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
1da40 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
1da50 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
1da60 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70   pPg */.  Pgno p
1da70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1da80 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
1da90 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f  umber to read */
1daa0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1dab0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1dac0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1dad0 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  /.  int pgsz = p
1dae0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1daf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1db00 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a  tes to read */..
1db10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1db20 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1db30 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42  READER && !MEMDB
1db40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
1db50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1db60 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
1db70 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69  ITE_OMIT_WAL.  i
1db80 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20  f( iFrame ){.   
1db90 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20   /* Try to pull 
1dba0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1dbb0 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  e write-ahead lo
1dbc0 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
1dbd0 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61  qlite3WalReadFra
1dbe0 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1dbf0 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70   iFrame, pgsz, p
1dc00 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65  Pg->pData);.  }e
1dc10 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
1dc20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d     i64 iOffset =
1dc30 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
1dc40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1dc50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1dc60 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1dc70 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  fd, pPg->pData, 
1dc80 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a  pgsz, iOffset);.
1dc90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1dca0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1dcb0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
1dcc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1dcd0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67   }.  }..  if( pg
1dce0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28  no==1 ){.    if(
1dcf0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
1dd00 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75  If the read is u
1dd10 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74  nsuccessful, set
1dd20 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b   the dbFileVers[
1dd30 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20  ] to something. 
1dd40 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c       ** that wil
1dd50 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c  l never be a val
1dd60 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e  id file version.
1dd70 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69    dbFileVers[] i
1dd80 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a  s a copy.      *
1dd90 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33  * of bytes 24..3
1dda0 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1ddb0 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31  e.  Bytes 28..31
1ddc0 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
1ddd0 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  e.      ** zero 
1dde0 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
1ddf0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1de00 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33  age. Bytes 32..3
1de10 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20  5 and 35..39.   
1de20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
1de30 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69  page numbers whi
1de40 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66  ch are never 0xf
1de50 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c  fffffff.  So fil
1de60 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50  ling.      ** pP
1de70 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1de80 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66  [] with all 0xff
1de90 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75   bytes should su
1dea0 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  ffice..      **.
1deb0 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20        ** For an 
1dec0 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61  encrypted databa
1ded0 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f  se, the situatio
1dee0 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  n is more comple
1def0 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20  x:  bytes.      
1df00 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  ** 24..39 of the
1df10 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68   database are wh
1df20 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20  ite noise.  But 
1df30 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
1df40 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74  of.      ** whit
1df50 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67  e noise equaling
1df60 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66   16 bytes of 0xf
1df70 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79  f is vanishingly
1df80 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20   small so.      
1df90 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69  ** we should sti
1dfa0 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20  ll be ok..      
1dfb0 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  */.      memset(
1dfc0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1dfd0 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  rs, 0xff, sizeof
1dfe0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1dff0 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ers));.    }else
1e000 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69  {.      u8 *dbFi
1e010 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29  leVers = &((u8*)
1e020 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b  pPg->pData)[24];
1e030 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
1e040 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e050 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1e060 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1e070 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1e080 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  }.  }.  CODEC1(p
1e090 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
1e0a0 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d  a, pgno, 3, rc =
1e0b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1e0c0 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e  PT);..  PAGER_IN
1e0d0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1e0e0 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
1e0f0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1e100 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
1e110 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
1e120 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1e130 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54  pgno));.  PAGERT
1e140 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20  RACE(("FETCH %d 
1e150 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
1e160 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
1e170 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1e180 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
1e190 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1e1a0 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
1e1b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  ;.}../*.** Updat
1e1c0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
1e1d0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1e1e0 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34 20  r at offsets 24 
1e1f0 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65  and 92 in.** the
1e200 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
1e210 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  sqlite version n
1e220 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20  umber at offset 
1e230 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  96..**.** This i
1e240 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  s an uncondition
1e250 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65 20  al update.  See 
1e260 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69  also the pager_i
1e270 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1e280 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  r().** routine w
1e290 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65  hich only update
1e2a0 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  s the change-cou
1e2b0 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64 61  nter if the upda
1e2c0 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a  te is actually.*
1e2d0 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74  * needed, as det
1e2e0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70  ermined by the p
1e2f0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1e300 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72  ntDone state var
1e310 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
1e320 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74   void pager_writ
1e330 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
1e340 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75  PgHdr *pPg){.  u
1e350 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
1e360 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65  r;..  /* Increme
1e370 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
1e380 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
1e390 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
1e3a0 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65   24. */.  change
1e3b0 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
1e3c0 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
1e3d0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46  pPg->pPager->dbF
1e3e0 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75  ileVers)+1;.  pu
1e3f0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1e400 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  pPg->pData)+24, 
1e410 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1e420 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72  ..  /* Also stor
1e430 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72  e the SQLite ver
1e440 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62  sion number in b
1e450 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20  ytes 96..99 and 
1e460 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32  in.  ** bytes 92
1e470 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63  ..95 store the c
1e480 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f  hange counter fo
1e490 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73  r which the vers
1e4a0 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  ion number.  ** 
1e4b0 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70  is valid. */.  p
1e4c0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1e4d0 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c  )pPg->pData)+92,
1e4e0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1e4f0 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1e500 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1e510 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52  )+96, SQLITE_VER
1e520 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a  SION_NUMBER);.}.
1e530 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e540 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54  OMIT_WAL./*.** T
1e550 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e560 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72  invoked once for
1e570 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20   each page that 
1e580 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1e590 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
1e5a0 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77  o the log file w
1e5b0 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61  hen a WAL transa
1e5c0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1e5d0 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74  back..** Paramet
1e5e0 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61  er iPg is the pa
1e5f0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69  ge number of sai
1e600 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78  d page. The pCtx
1e610 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73   argument .** is
1e620 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e   actually a poin
1e630 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
1e640 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
1e650 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73  * If page iPg is
1e660 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
1e670 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e  cache, and has n
1e680 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
1e690 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20  ferences,.** it 
1e6a0 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74  is discarded. Ot
1e6b0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72  herwise, if ther
1e6c0 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  e are one or mor
1e6d0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a  e outstanding.**
1e6e0 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65   references, the
1e6f0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1e700 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74   reloaded from t
1e710 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
1e720 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74  the.** attempt t
1e730 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74  o reload content
1e740 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1e750 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61  se is required a
1e760 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65  nd fails, .** re
1e770 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
1e780 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
1e790 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
1e7a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e7b0 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1e7c0 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e  (void *pCtx, Pgn
1e7d0 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63  o iPg){.  int rc
1e7e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e7f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e800 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20  (Pager *)pCtx;. 
1e810 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1e820 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
1e830 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
1e840 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
1e850 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
1e860 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50  , iPg);.  if( pP
1e870 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  g ){.    if( sql
1e880 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
1e890 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29  fcount(pPg)==1 )
1e8a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1e8b0 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
1e8c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e8d0 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
1e8e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e8f0 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
1e900 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
1e910 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  g->pgno, &iFrame
1e920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1e930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e940 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
1e950 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d  bPage(pPg, iFram
1e960 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1e970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e980 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1e990 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
1e9a0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
1e9b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1e9c0 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50  rUnrefNotNull(pP
1e9d0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
1e9e0 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66   /* Normally, if
1e9f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1ea00 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  s rolled back, a
1ea10 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ny backup proces
1ea20 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64  ses are.  ** upd
1ea30 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20  ated as data is 
1ea40 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68  copied out of th
1ea50 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1ea60 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a  al and into the.
1ea70 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
1ea80 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72  his is not gener
1ea90 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69  ally possible wi
1eaa0 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  th a WAL databas
1eab0 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62  e, as.  ** rollb
1eac0 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d  ack involves sim
1ead0 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74  ply truncating t
1eae0 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65  he log file. The
1eaf0 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20  refore, if one. 
1eb00 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d   ** or more fram
1eb10 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
1eb20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1eb30 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65  the log (and the
1eb40 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73  refore .  ** als
1eb50 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  o copied into th
1eb60 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73  e backup databas
1eb70 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74  es) as part of t
1eb80 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
1eb90 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70  .  ** the backup
1eba0 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72  s must be restar
1ebb0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ted..  */.  sqli
1ebc0 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
1ebd0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
1ebe0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1ebf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1ec00 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1ec10 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  d to rollback a 
1ec20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61  transaction on a
1ec30 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a   WAL database..*
1ec40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1ec50 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61  erRollbackWal(Pa
1ec60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1ec70 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec90 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
1eca0 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74  /.  PgHdr *pList
1ecb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ecc0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64      /* List of d
1ecd0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65  irty pages to re
1ece0 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f  vert */..  /* Fo
1ecf0 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74  r all pages in t
1ed00 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72  he cache that ar
1ed10 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  e currently dirt
1ed20 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64  y or have alread
1ed30 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74  y.  ** been writ
1ed40 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d  ten (but not com
1ed50 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c  mitted) to the l
1ed60 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20  og file, do one 
1ed70 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c  of the .  ** fol
1ed80 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a  lowing:.  **.  *
1ed90 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68  *   + Discard th
1eda0 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69  e cached page (i
1edb0 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20  f refcount==0), 
1edc0 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f  or.  **   + Relo
1edd0 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
1ede0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1edf0 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30  e (if refcount>0
1ee00 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  )..  */.  pPager
1ee10 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
1ee20 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
1ee30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1ee40 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
1ee50 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c  l, pagerUndoCall
1ee60 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50  back, (void *)pP
1ee70 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d  ager);.  pList =
1ee80 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
1ee90 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
1eea0 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c  pPCache);.  whil
1eeb0 65 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d  e( pList && rc==
1eec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eed0 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20   PgHdr *pNext = 
1eee0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
1eef0 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64     rc = pagerUnd
1ef00 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20  oCallback((void 
1ef10 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  *)pPager, pList-
1ef20 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73  >pgno);.    pLis
1ef30 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  t = pNext;.  }..
1ef40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ef50 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1ef60 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72  ion is a wrapper
1ef70 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57   around sqlite3W
1ef80 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77  alFrames(). As w
1ef90 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a  ell as logging.*
1efa0 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
1efb0 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  f the list of pa
1efc0 67 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c  ges headed by pL
1efd0 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ist (connected b
1efe0 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68  y pDirty),.** th
1eff0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69  is function noti
1f000 66 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20  fies any active 
1f010 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
1f020 20 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20   that the pages 
1f030 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e  have.** changed.
1f040 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74   .**.** The list
1f050 20 6f 66 20 70 61 67 65 73 20 70 61 73 73 65 64   of pages passed
1f060 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69   into this routi
1f070 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72  ne is always sor
1f080 74 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62  ted by page numb
1f090 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66  er..** Hence, if
1f0a0 20 70 61 67 65 20 31 20 61 70 70 65 61 72 73 20   page 1 appears 
1f0b0 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
1f0c0 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65  list, it will be
1f0d0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 2e   the first page.
1f0e0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
1f0f0 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a  pagerWalFrames(.
1f100 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1f130 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  t */.  PgHdr *pL
1f140 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
1f150 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1f160 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20  f frames to log 
1f170 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63  */.  Pgno nTrunc
1f180 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1f190 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1f1a0 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73   size after this
1f1b0 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
1f1c0 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f1e0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
1f1f0 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20  a commit */.){. 
1f200 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1f230 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20  */.  int nList; 
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f260 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74  f pages in pList
1f270 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 3b 20   */.  PgHdr *p; 
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1f2a0 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20  ping over pages 
1f2b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1f2c0 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20  ager->pWal );.  
1f2d0 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1f2e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1f2f0 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
1f300 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6c   that the page l
1f310 69 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64  ist is in accend
1f320 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66  ing order */.  f
1f330 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26  or(p=pList; p &&
1f340 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d   p->pDirty; p=p-
1f350 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73  >pDirty){.    as
1f360 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20  sert( p->pgno < 
1f370 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20  p->pDirty->pgno 
1f380 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1f390 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
1f3a0 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43  pDirty==0 || isC
1f3b0 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69  ommit );.  if( i
1f3c0 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f  sCommit ){.    /
1f3d0 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73  * If a WAL trans
1f3e0 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
1f3f0 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65  committed, there
1f400 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1f410 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61  writing.    ** a
1f420 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61  ny pages with pa
1f430 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
1f440 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74  er than nTruncat
1f450 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66  e into the WAL f
1f460 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79  ile..    ** They
1f470 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72   will never be r
1f480 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e  ead by any clien
1f490 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65  t. So remove the
1f4a0 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74  m from the pDirt
1f4b0 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65  y.    ** list he
1f4c0 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72  re. */.    PgHdr
1f4d0 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69   **ppNext = &pLi
1f4e0 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  st;.    nList = 
1f4f0 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  0;.    for(p=pLi
1f500 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70  st; (*ppNext = p
1f510 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74  )!=0; p=p->pDirt
1f520 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  y){.      if( p-
1f530 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65  >pgno<=nTruncate
1f540 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e 65   ){.        ppNe
1f550 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b  xt = &p->pDirty;
1f560 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b  .        nList++
1f570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f580 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
1f590 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1f5a0 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d    nList = 1;.  }
1f5b0 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74  .  pPager->aStat
1f5c0 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
1f5d0 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20  E] += nList;..  
1f5e0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
1f5f0 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
1f600 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
1f610 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71  List);.  rc = sq
1f620 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70  lite3WalFrames(p
1f630 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
1f640 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
1f650 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72  Size, pList, nTr
1f660 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74  uncate, isCommit
1f670 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  , pPager->walSyn
1f680 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66  cFlags.  );.  if
1f690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f6a0 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  && pPager->pBack
1f6b0 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d  up ){.    for(p=
1f6c0 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1f6d0 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71  Dirty){.      sq
1f6e0 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
1f6f0 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
1f700 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20  p, p->pgno, (u8 
1f710 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  *)p->pData);.   
1f720 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
1f730 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1f740 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  S.  pList = sqli
1f750 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1f760 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1f770 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  he);.  for(p=pLi
1f780 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
1f790 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73  ty){.    pager_s
1f7a0 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a  et_pagehash(p);.
1f7b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
1f7c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f7d0 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74  * Begin a read t
1f7e0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f7f0 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  e WAL..**.** Thi
1f800 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  s routine used t
1f810 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67  o be called "pag
1f820 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29  erOpenSnapshot()
1f830 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73  " because it ess
1f840 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  entially.** make
1f850 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20  s a snapshot of 
1f860 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
1f870 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e  the current poin
1f880 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72  t in time and pr
1f890 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20  eserves.** that 
1f8a0 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65  snapshot for use
1f8b0 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69   by the reader i
1f8c0 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75  n spite of concu
1f8d0 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20  rrently changes 
1f8e0 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74  by.** other writ
1f8f0 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e  ers or checkpoin
1f900 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
1f910 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65  int pagerBeginRe
1f920 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  adTransaction(Pa
1f930 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1f940 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f960 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1f970 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20  /.  int changed 
1f980 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f990 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
1f9a0 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73  ache must be res
1f9b0 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
1f9c0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1f9d0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
1f9e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1f9f0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  ==PAGER_OPEN || 
1fa00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1fa10 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
1fa20 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c  .  /* sqlite3Wal
1fa30 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
1fa40 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  on() was not cal
1fa50 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76  led for the prev
1fa60 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ious.  ** transa
1fa70 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67  ction in locking
1fa80 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e  _mode=EXCLUSIVE.
1fa90 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77    So call it now
1faa0 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72  .  If we.  ** ar
1fab0 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e in locking_mod
1fac0 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64  e=NORMAL and End
1fad0 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69  Read() was previ
1fae0 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20  ously called,.  
1faf0 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  ** the duplicate
1fb00 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73   call is harmles
1fb10 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
1fb20 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
1fb30 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1fb40 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Wal);..  rc = sq
1fb50 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61  lite3WalBeginRea
1fb60 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1fb70 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e  ger->pWal, &chan
1fb80 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ged);.  if( rc!=
1fb90 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61  SQLITE_OK || cha
1fba0 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65  nged ){.    page
1fbb0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1fbc0 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
1fbd0 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
1fbe0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
1fbf0 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
1fc00 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1fc10 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1fc20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1fc30 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
1fc40 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  t of the transit
1fc50 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f  ion from PAGER_O
1fc60 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f  PEN.** to PAGER_
1fc70 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20  READER state to 
1fc80 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
1fc90 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1fca0 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61  se file.** in pa
1fcb0 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  ges (assuming th
1fcc0 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72  e page size curr
1fcd0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
1fce0 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e  Pager.pageSize).
1fcf0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
1fd00 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
1fd10 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1fd20 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
1fd30 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1fd40 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f   in pages is sto
1fd50 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20  red in *pnPage. 
1fd60 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
1fd70 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70  ror code (perhap
1fd80 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52  s.** SQLITE_IOER
1fd90 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75  R_FSTAT) is retu
1fda0 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65  rned and *pnPage
1fdb0 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
1fdc0 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
1fdd0 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  nt pagerPagecoun
1fde0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1fdf0 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a   Pgno *pnPage){.
1fe00 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
1fe30 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
1fe40 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20   */..  /* Query 
1fe50 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1fe60 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  em for the datab
1fe70 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61  ase size. The Wa
1fe80 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66  lDbsize().  ** f
1fe90 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1fea0 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20  zero if the WAL 
1feb0 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65  is not open (i.e
1fec0 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29  . Pager.pWal==0)
1fed0 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65  , or.  ** if the
1fee0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1fef0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
1ff00 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ff10 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ze is not.  ** a
1ff20 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
1ff30 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1ff40 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   if the log file
1ff50 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a   is empty or.  *
1ff60 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61  * contains no va
1ff70 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72  lid committed tr
1ff80 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f  ansactions..  */
1ff90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ffa0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1ffb0 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
1ffc0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
1ffd0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
1ffe0 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74  .  nPage = sqlit
1fff0 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67  e3WalDbsize(pPag
20000 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a  er->pWal);..  /*
20010 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
20020 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
20030 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
20040 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
20050 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d 73  e.  ** WAL sub-s
20060 79 73 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e 65  ystem, determine
20070 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 65   the page counte
20080 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
20090 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64  ze of.  ** the d
200a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
200b0 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
200c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
200d0 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69  is not an.  ** i
200e0 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
200f0 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  of the page-size
20100 2c 20 72 6f 75 6e 64 20 75 70 20 74 68 65 20 72  , round up the r
20110 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
20120 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
20130 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69  /* Size of db fi
20160 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
20170 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
20180 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
20190 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
201a0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
201b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
201c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
201d0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
201e0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
201f0 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  &n);.      if( r
20200 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20210 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
20220 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
20230 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67  .    nPage = (Pg
20240 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70  no)((n+pPager->p
20250 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61  ageSize-1) / pPa
20260 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
20270 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
20280 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   current number 
20290 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
202a0 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
202b0 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f  than the.  ** co
202c0 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d  nfigured maximum
202d0 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69   pager number, i
202e0 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
202f0 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a  wed limit so.  *
20300 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  * that the file 
20310 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a  can be read..  *
20320 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50  /.  if( nPage>pP
20330 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
20340 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
20350 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65  no = (Pgno)nPage
20360 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65  ;.  }..  *pnPage
20370 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
20380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20390 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
203a0 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43  OMIT_WAL./*.** C
203b0 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61  heck if the *-wa
203c0 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72  l file that corr
203d0 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64  esponds to the d
203e0 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
203f0 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73  y pPager.** exis
20400 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ts if the databa
20410 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20  se is not empy, 
20420 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74  or verify that t
20430 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
20440 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20  es.** not exist 
20450 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29  (by deleting it)
20460 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20470 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a   file is empty..
20480 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
20490 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
204a0 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c  ty and the *-wal
204b0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70   file exists, op
204c0 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  en the pager.** 
204d0 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66  in WAL mode.  If
204e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
204f0 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20   empty or if no 
20500 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
20510 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65  s and.** if no e
20520 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b  rror occurs, mak
20530 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75  e sure Pager.jou
20540 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20  rnalMode is not 
20550 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  set to.** PAGER_
20560 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e  JOURNALMODE_WAL.
20570 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
20580 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72  LITE_OK or an er
20590 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
205a0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
205b0 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f  hold a SHARED lo
205c0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
205d0 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20  se file to call 
205e0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
205f0 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43  . Because an EXC
20600 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
20610 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65  he db file is re
20620 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65  quired to delete
20630 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20   .** a WAL on a 
20640 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62  none-empty datab
20650 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  ase, this ensure
20660 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61  s there is no ra
20670 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a  ce condition .**
20680 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63   between the xAc
20690 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64  cess() below and
206a0 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65   an xDelete() be
206b0 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20  ing executed by 
206c0 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63  some .** other c
206d0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
206e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
206f0 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50  enWalIfPresent(P
20700 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20710 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20720 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
20730 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
20740 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
20750 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20760 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
20770 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  K );..  if( !pPa
20780 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
20790 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20  .    int isWal; 
207a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41     /* True if WA
207c0 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  L file exists */
207d0 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  .    Pgno nPage;
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
20800 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20810 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  */..    rc = pag
20820 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
20830 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
20840 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
20850 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61   rc;.    if( nPa
20860 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ge==0 ){.      r
20870 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
20880 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
20890 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
208a0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
208b0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  ==SQLITE_IOERR_D
208c0 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63  ELETE_NOENT ) rc
208d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
208e0 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20      isWal = 0;. 
208f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20900 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
20910 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
20920 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
20930 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49  ager->zWal, SQLI
20940 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
20950 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29  , &isWal.      )
20960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20980 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c  .      if( isWal
20990 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
209a0 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61  case( sqlite3Pca
209b0 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
209c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
209d0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
209e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
209f0 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b  nWal(pPager, 0);
20a00 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20a10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20a20 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
20a30 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20  NALMODE_WAL ){. 
20a40 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
20a50 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
20a60 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
20a70 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  ELETE;.      }. 
20a80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
20a90 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
20aa0 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73  /*.** Playback s
20ab0 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f  avepoint pSavepo
20ac0 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76  int. Or, if pSav
20ad0 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68  epoint==NULL, th
20ae0 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74  en playback.** t
20af0 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
20b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
20b10 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69  he case pSavepoi
20b20 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20  nt==NULL occurs 
20b30 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42  when .** a ROLLB
20b40 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
20b50 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53  s invoked on a S
20b60 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73  AVEPOINT that is
20b70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
20b80 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ** savepoint..**
20b90 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f  .** When pSavepo
20ba0 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  int is not NULL 
20bb0 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74  (meaning a non-t
20bc0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
20bd0 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e  oint is .** bein
20be0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20  g rolled back), 
20bf0 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
20c00 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70  k consists of up
20c10 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73   to three stages
20c20 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69  ,.** performed i
20c30 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63  n the order spec
20c40 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ified:.**.**   *
20c50 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   Pages are playe
20c60 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
20c70 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
20c80 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a  rting at byte.**
20c90 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65       offset Page
20ca0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
20cb0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
20cc0 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67  g to .**     Pag
20cd0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
20ce0 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68  Offset, or to th
20cf0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
20d00 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
20d10 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61   file if PagerSa
20d20 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
20d30 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  et is zero..**.*
20d40 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61  *   * If PagerSa
20d50 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
20d60 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  et is not zero, 
20d70 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70  then pages are p
20d80 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63  layed.**     bac
20d90 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  k starting from 
20da0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
20db0 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  er immediately f
20dc0 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20  ollowing .**    
20dd0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20de0 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68  iHdrOffset to th
20df0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
20e00 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  n journal file..
20e10 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
20e20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20  are then played 
20e30 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75  back from the su
20e40 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
20e50 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20  starting.**     
20e60 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61  with the PagerSa
20e70 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20  vepoint.iSubRec 
20e80 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
20e90 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  o the end of.** 
20ea0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
20eb0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f  file..**.** Thro
20ec0 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62  ughout the rollb
20ed0 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63  ack process, eac
20ee0 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  h time a page is
20ef0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
20f00 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
20f10 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
20f20 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74   a bitvec struct
20f30 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44  ure (variable pD
20f40 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d  one in the.** im
20f50 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c  plementation bel
20f60 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65  ow). This is use
20f70 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
20f80 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a   a page is only.
20f90 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ** rolled back t
20fa0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
20fb0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
20fc0 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61  in either journa
20fd0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76  l..**.** If pSav
20fe0 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  epoint is NULL, 
20ff0 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f  then pages are o
21000 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  nly played back 
21010 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  from the main.**
21020 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
21030 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
21040 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20  for a bitvec in 
21050 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
21060 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
21070 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b   before playback
21080 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50   commences the P
21090 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69  ager.dbSize vari
210a0 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74  able.** is reset
210b0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68   to the value th
210c0 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68  at it held at th
210d0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73  e start of the s
210e0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72  avepoint .** (or
210f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e   transaction). N
21100 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61  o page with a pa
21110 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge-number greate
21120 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
21130 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62  e.** is played b
21140 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65  ack. If one is e
21150 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
21160 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e   simply skipped.
21170 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
21180 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
21190 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
211a0 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f  ger, PagerSavepo
211b0 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29  int *pSavepoint)
211c0 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
211e0 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  Effective size o
211f0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
21200 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
21210 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
21220 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74   /* End of first
21230 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e   segment of main
21240 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73  -journal records
21250 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
21260 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
21270 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
21280 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
21290 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42   = 0;       /* B
212a0 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20  itvec to ensure 
212b0 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63  pages played bac
212c0 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a  k only once */..
212d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
212e0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
212f0 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
21300 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
21310 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
21320 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  LOCKED );..  /* 
21330 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65  Allocate a bitve
21340 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72  c to use to stor
21350 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67  e the set of pag
21360 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a  es rolled back *
21370 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
21380 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20  nt ){.    pDone 
21390 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
213a0 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74  reate(pSavepoint
213b0 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66  ->nOrig);.    if
213c0 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ( !pDone ){.    
213d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
213e0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
213f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
21400 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
21410 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
21420 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72  lue it was befor
21430 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  e the savepoint 
21440 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65  .  ** being reve
21450 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e  rted was opened.
21460 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
21470 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f  dbSize = pSavepo
21480 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  int ? pSavepoint
21490 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72  ->nOrig : pPager
214a0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
214b0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
214c0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
214d0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
214e0 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26  f( !pSavepoint &
214f0 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
21500 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
21510 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  urn pagerRollbac
21520 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  kWal(pPager);.  
21530 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67  }..  /* Use pPag
21540 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61  er->journalOff a
21550 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
21560 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
21570 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
21580 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74  ournal.  The act
21590 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ual file might b
215a0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
215b0 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52  is in.  ** PAGER
215c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
215d0 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a  NCATE or PAGER_J
215e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
215f0 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e  ST.  But anythin
21600 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67  g.  ** past pPag
21610 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  er->journalOff i
21620 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20  s off-limits to 
21630 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d  us..  */.  szJ =
21640 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21650 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
21660 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
21670 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20  r)==0 || szJ==0 
21680 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  );..  /* Begin b
21690 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  y rolling back r
216a0 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
216b0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
216c0 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61  rting at.  ** Pa
216d0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
216e0 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
216f0 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ing to the next 
21700 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
21710 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74    ** There might
21720 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74   be records in t
21730 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21740 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65  that have a page
21750 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65   number.  ** gre
21760 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
21770 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73  rrent database s
21780 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53  ize (pPager->dbS
21790 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20  ize) but those. 
217a0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
217b0 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ped automaticall
217c0 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64  y.  Pages are ad
217d0 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20  ded to pDone as 
217e0 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c  they.  ** are pl
217f0 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
21800 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
21810 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c   && !pagerUseWal
21820 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
21830 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70  iHdrOff = pSavep
21840 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
21850 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   ? pSavepoint->i
21860 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b  HdrOffset : szJ;
21870 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
21880 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70  rnalOff = pSavep
21890 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  oint->iOffset;. 
218a0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
218b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
218c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48  r->journalOff<iH
218d0 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  drOff ){.      r
218e0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
218f0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
21900 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
21910 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
21920 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
21930 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21940 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65  ITE_DONE );.  }e
21950 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
21960 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
21970 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69  .  }..  /* Conti
21980 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  nue rolling back
21990 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20   records out of 
219a0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
219b0 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
219c0 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  * the first jour
219d0 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20  nal header seen 
219e0 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75  and continuing u
219f0 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69  ntil the effecti
21a00 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74  ve end.  ** of t
21a10 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21a20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20  file.  Continue 
21a30 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72  to skip out-of-r
21a40 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20  ange pages and. 
21a50 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64   ** continue add
21a60 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64  ing pages rolled
21a70 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a   back to pDone..
21a80 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63    */.  while( rc
21a90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
21aa0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21ab0 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  f<szJ ){.    u32
21ac0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
21ad0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
21ae0 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  */.    u32 nJRec
21af0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
21b00 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
21b10 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
21b20 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
21b30 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
21b40 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c  (pPager, 0, szJ,
21b50 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
21b60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
21b70 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
21b80 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
21b90 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75  The "pPager->jou
21ba0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
21bb0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
21bc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21bd0 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20  ff".    ** test 
21be0 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69  is related to ti
21bf0 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65  cket #2565.  See
21c00 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20   the discussion 
21c10 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  in the.    ** pa
21c20 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66  ger_playback() f
21c30 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  unction for addi
21c40 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
21c50 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
21c60 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
21c70 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
21c80 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
21c90 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
21ca0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21cb0 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
21cc0 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73  nJRec = (u32)((s
21cd0 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
21ce0 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c  rnalOff)/JOURNAL
21cf0 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
21d00 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
21d10 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
21d20 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26  OK && ii<nJRec &
21d30 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
21d40 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b  lOff<szJ; ii++){
21d50 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
21d60 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
21d70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
21d80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
21d90 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
21da0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
21db0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
21dc0 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
21dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21de0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
21df0 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20  alOff>=szJ );.. 
21e00 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f   /* Finally,  ro
21e10 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f  llback pages fro
21e20 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
21e30 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65  l.  Page that we
21e40 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  re.  ** previous
21e50 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ly rolled back o
21e60 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
21e70 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20  ournal (and are 
21e80 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a  hence in pDone).
21e90 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
21ea0 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61  pped.  Out-of-ra
21eb0 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c  nge pages are al
21ec0 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  so skipped..  */
21ed0 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
21ee0 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  t ){.    u32 ii;
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
21f00 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
21f10 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
21f20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d  (i64)pSavepoint-
21f30 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >iSubRec*(4+pPag
21f40 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
21f50 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
21f60 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
21f70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21f80 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64  3WalSavepointUnd
21f90 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
21fa0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c  pSavepoint->aWal
21fb0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
21fc0 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69   for(ii=pSavepoi
21fd0 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d  nt->iSubRec; rc=
21fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
21ff0 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  <pPager->nSubRec
22000 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
22010 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28  ssert( offset==(
22020 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72  i64)ii*(4+pPager
22030 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20  ->pageSize) );. 
22040 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
22050 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
22060 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65  e(pPager, &offse
22070 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b  t, pDone, 0, 1);
22080 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22090 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
220a0 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  NE );.  }..  sql
220b0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
220c0 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20  y(pDone);.  if( 
220d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
220e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
220f0 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
22100 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
22110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
22120 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
22130 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
22140 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
22150 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72  allowed.** befor
22160 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
22170 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20 61 6e  recycle clean an
22180 64 20 75 6e 75 73 65 64 20 70 61 67 65 73 2e 0a  d unused pages..
22190 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
221a0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
221b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
221c0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
221d0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
221e0 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
221f0 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
22200 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  );.}../*.** Chan
22210 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
22220 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
22230 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
22240 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66  e allowed.** bef
22250 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
22260 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20 74 6f  o spill pages to
22270 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
22280 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22290 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65 72 20  Spillsize(Pager 
222a0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
222b0 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  age){.  return s
222c0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 53  qlite3PcacheSetS
222d0 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65 72 2d  pillsize(pPager-
222e0 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
222f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  );.}../*.** Invo
22300 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ke SQLITE_FCNTL_
22310 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20  MMAP_SIZE based 
22320 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  on the current v
22330 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a  alue of szMmap..
22340 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
22350 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
22360 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22370 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
22380 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c  MAP_SIZE>0.  sql
22390 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
223a0 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66  pPager->fd;.  if
223b0 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20  ( isOpen(fd) && 
223c0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
223d0 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20  ersion>=3 ){.   
223e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
223f0 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67  z;.    sz = pPag
22400 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20  er->szMmap;.    
22410 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63  pPager->bUseFetc
22420 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20  h = (sz>0);.    
22430 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
22440 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
22450 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
22460 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
22470 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
22480 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
22490 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
224a0 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70  f any memory map
224b0 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65  ping made of the
224c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
224d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
224e0 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
224f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
22500 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
22510 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d  Mmap){.  pPager-
22520 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  >szMmap = szMmap
22530 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c  ;.  pagerFixMapl
22540 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  imit(pPager);.}.
22550 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d  ./*.** Free as m
22560 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
22570 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ssible from the 
22580 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pager..*/.void s
22590 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
225a0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
225b0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
225c0 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e  eShrink(pPager->
225d0 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
225e0 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e  ** Adjust settin
225f0 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  gs of the pager 
22600 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
22610 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67  ed in the pgFlag
22620 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  s parameter..**.
22630 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69  ** The "level" i
22640 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  n pgFlags & PAGE
22650 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
22660 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75  SK sets the robu
22670 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65  stness.** of the
22680 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
22690 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
226a0 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66  ashes or power f
226b0 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68  ailures by.** ch
226c0 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
226d0 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
226e0 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  en writing the j
226f0 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72  ournals..** Ther
22700 65 20 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c  e are four level
22710 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
22720 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
22730 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
22740 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
22750 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
22760 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
22770 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
22780 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
22790 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
227a0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
227b0 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
227c0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
227d0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
227e0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
227f0 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
22800 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
22810 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
22830 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
22840 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
22850 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
22860 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22870 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
22880 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
22890 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
228a0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
228b0 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
228c0 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
228d0 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
228e0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
22900 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
22910 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
22920 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
22930 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
22940 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
22950 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
22960 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22970 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
22980 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
22990 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
229a0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
229b0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
229c0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
229d0 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
229e0 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
229f0 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
22a00 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
22a10 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
22a20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
22a30 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
22a40 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
22a50 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
22a60 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
22a70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22a80 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
22a90 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
22aa0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
22ab0 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
22ac0 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
22ad0 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
22ae0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
22af0 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
22b00 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20  .**.**    EXTRA 
22b10 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65      This is like
22b20 20 46 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61   FULL except tha
22b30 74 20 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20  t is also syncs 
22b40 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
22b60 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
22b70 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
22b80 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62   after the rollb
22b90 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ack.**          
22ba0 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75      journal is u
22bb0 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nlinked..**.** T
22bc0 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20  he above is for 
22bd0 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  a rollback-journ
22be0 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41  al mode.  For WA
22bf0 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74  L mode, OFF cont
22c00 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e  inues.** to mean
22c10 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65   that no syncs e
22c20 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d  ver occur.  NORM
22c30 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  AL means that th
22c40 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a  e WAL is synced.
22c50 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ** prior to the 
22c60 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f  start of checkpo
22c70 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65  int and that the
22c80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
22c90 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74  s synced.** at t
22ca0 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
22cb0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
22cc0 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  if the entire co
22cd0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c  ntent of the WAL
22ce0 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20  .** was written 
22cf0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
22d00 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20  tabase.  But no 
22d10 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20  sync operations 
22d20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20  occur for.** an 
22d30 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20  ordinary commit 
22d40 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77  in NORMAL mode w
22d50 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d  ith WAL.  FULL m
22d60 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
22d70 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e  L.** file is syn
22d80 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ced following ea
22d90 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74  ch commit operat
22da0 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e  ion, in addition
22db0 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73   to the.** syncs
22dc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22dd0 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20   NORMAL.  There 
22de0 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  is no difference
22df0 20 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a   between FULL.**
22e00 20 61 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57   and EXTRA for W
22e10 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44  AL mode..**.** D
22e20 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79  o not confuse sy
22e30 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77  nchronous=FULL w
22e40 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ith SQLITE_SYNC_
22e50 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  FULL.  The.** SQ
22e60 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d  LITE_SYNC_FULL m
22e70 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73  acro means to us
22e80 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79  e the MacOSX-sty
22e90 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a  le full-fsync.**
22ea0 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46   using fcntl(F_F
22eb0 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49  ULLFSYNC).  SQLI
22ec0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d  TE_SYNC_NORMAL m
22ed0 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a  eans to do an.**
22ee0 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28   ordinary fsync(
22ef0 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69  ) call.  There i
22f00 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
22f10 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53  between SQLITE_S
22f20 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20  YNC_FULL.** and 
22f30 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22f40 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20  AL on platforms 
22f50 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53  other than MacOS
22f60 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73  X.  But the.** s
22f70 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
22f80 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f  versus synchrono
22f90 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e  us=NORMAL settin
22fa0 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  g determines whe
22fb0 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70  n.** the xSync p
22fc0 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c  rimitive is call
22fd0 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61  ed and is releva
22fe0 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f  nt to all platfo
22ff0 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  rms..**.** Numer
23000 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
23010 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
23020 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
23030 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
23040 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
23050 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23060 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
23070 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
23080 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61  erSetFlags(.  Pa
23090 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
230a0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
230b0 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c   to set safety l
230c0 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e  evel for */.  un
230d0 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
230e0 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66      /* Various f
230f0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  lags */.){.  uns
23100 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67  igned level = pg
23110 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59  Flags & PAGER_SY
23120 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a  NCHRONOUS_MASK;.
23130 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
23140 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
23150 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31  ager->noSync = 1
23160 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  ;.    pPager->fu
23170 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  llSync = 0;.    
23180 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
23190 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
231a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79      pPager->noSy
231b0 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47  nc =  level==PAG
231c0 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f  ER_SYNCHRONOUS_O
231d0 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61  FF ?1:0;.    pPa
231e0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
231f0 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e  level>=PAGER_SYN
23200 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31  CHRONOUS_FULL ?1
23210 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  :0;.    pPager->
23220 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65  extraSync = leve
23230 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l==PAGER_SYNCHRO
23240 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b  NOUS_EXTRA ?1:0;
23250 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
23260 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
23270 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
23280 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  gs = 0;.    pPag
23290 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
232a0 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  s = 0;.  }else i
232b0 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
232c0 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a  ER_FULLFSYNC ){.
232d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
232e0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
232f0 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50  YNC_FULL;.    pP
23300 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
23310 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23320 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20  C_FULL;.  }else 
23330 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
23340 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59  GER_CKPT_FULLFSY
23350 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  NC ){.    pPager
23360 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
23370 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23380 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
23390 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
233a0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
233b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
233c0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
233d0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
233e0 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
233f0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
23400 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
23410 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MAL;.  }.  pPage
23420 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
23430 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  = pPager->syncFl
23440 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ags;.  if( pPage
23450 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
23460 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
23470 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53  ncFlags |= WAL_S
23480 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
23490 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c  ;.  }.  if( pgFl
234a0 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48  ags & PAGER_CACH
234b0 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50  ESPILL ){.    pP
234c0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
234d0 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f   &= ~SPILLFLAG_O
234e0 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  FF;.  }else{.   
234f0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
23500 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
23510 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  _OFF;.  }.}.#end
23520 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
23530 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
23540 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
23550 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
23560 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
23570 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
23580 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
23590 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
235a0 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
235b0 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
235c0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
235d0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
235e0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
235f0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
23600 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
23610 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
23620 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
23630 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
23640 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
23650 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
23660 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
23670 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
23680 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
23690 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
236a0 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
236b0 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
236c0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
236d0 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
236e0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
236f0 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
23700 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
23710 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
23720 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
23730 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
23740 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
23750 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
23760 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
23770 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
23780 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
23790 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
237a0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
237b0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
237c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
237d0 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
237e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
237f0 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
23800 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
23810 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
23820 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
23830 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
23840 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
23850 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
23860 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
23870 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
23880 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
23890 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
238a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
238c0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
238d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
238e0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
238f0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
23900 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
23910 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
23920 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
23930 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
23940 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23950 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
23960 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
23970 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
23980 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
23990 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
239a0 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
239b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
239c0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
239d0 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
239e0 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
239f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
23a00 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
23a10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23a20 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
23a30 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
23a40 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
23a50 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
23a60 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
23a70 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
23a80 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
23a90 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
23aa0 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
23ab0 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
23ac0 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
23ad0 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
23ae0 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
23af0 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
23b00 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
23b10 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
23b20 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
23b30 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
23b40 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
23b50 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
23b60 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
23b70 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
23b80 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
23b90 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
23ba0 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
23bb0 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
23bc0 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
23bd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
23be0 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
23c00 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
23c10 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
23c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c50 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
23c60 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
23c70 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
23c80 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
23c90 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
23ca0 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
23cb0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
23cc0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
23cd0 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
23ce0 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
23cf0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
23d00 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
23d10 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
23d20 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
23d30 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
23d40 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
23d50 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
23d60 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
23d70 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
23d80 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
23d90 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
23da0 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
23db0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
23dc0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
23dd0 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
23de0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e00 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
23e10 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
23e20 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
23e30 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
23e40 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
23e50 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
23e60 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
23e70 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
23e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
23e90 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
23ea0 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
23eb0 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  /.){.  pPager->x
23ec0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
23ed0 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
23ee0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
23ef0 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
23f00 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20  dlerArg;..  if( 
23f10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
23f20 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  d) ){.    void *
23f30 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26  *ap = (void **)&
23f40 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
23f50 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  dler;.    assert
23f60 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20  ( ((int(*)(void 
23f70 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75  *))(ap[0]))==xBu
23f80 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20  syHandler );.   
23f90 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d   assert( ap[1]==
23fa0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
23fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
23fc0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
23fd0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
23fe0 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e  TE_FCNTL_BUSYHAN
23ff0 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70  DLER, (void *)ap
24000 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
24010 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
24020 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
24030 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
24040 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
24050 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
24060 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
24070 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
24080 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
24090 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
240a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
240b0 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
240c0 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
240d0 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
240e0 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
240f0 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
24100 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
24110 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45  IOERR, an SQLITE
24120 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63  _IOERR_xxx sub-c
24130 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ode or SQLITE_FU
24140 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
24150 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
24160 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
24170 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
24180 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
24190 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
241a0 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
241b0 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
241c0 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
241d0 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
241e0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
241f0 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
24200 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
24210 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
24220 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
24230 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
24240 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
24250 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
24260 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
24270 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
24280 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
24290 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
242a0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
242b0 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
242c0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
242d0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
242e0 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
242f0 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
24300 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
24310 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
24320 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
24330 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
24340 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
24350 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
24360 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
24370 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
24380 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
24390 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
243a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
243b0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
243c0 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
243d0 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
243e0 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
243f0 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
24400 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
24410 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
24420 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
24430 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
24440 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
24450 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
24460 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
24470 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
24480 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
24490 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
244a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
244b0 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
244c0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
244d0 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
244e0 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
244f0 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
24500 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
24510 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
24520 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
24530 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
24540 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
24550 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
24560 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a  r, u32 *pPageSiz
24570 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
24580 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
24590 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74  ITE_OK;..  /* It
245a0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
245b0 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73   to do a full as
245c0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
245d0 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73  () here, as this
245e0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  .  ** function m
245f0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ay be called fro
24600 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70  m within PagerOp
24610 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65  en(), before the
24620 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
24630 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
24640 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  is internally co
24650 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20  nsistent..  **. 
24660 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   ** At one point
24670 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
24680 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
24690 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61   if the pager wa
246a0 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52  s in .  ** PAGER
246b0 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75  _ERROR state. Bu
246c0 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52  t since PAGER_ER
246d0 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e  ROR state guaran
246e0 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  tees that.  ** t
246f0 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74  here is at least
24700 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
24710 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c   page reference,
24720 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
24730 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66   ** is a no-op f
24740 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79  or that case any
24750 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32  how..  */..  u32
24760 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
24770 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
24780 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
24790 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
247a0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
247b0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
247c0 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  E) );.  if( (pPa
247d0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
247e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
247f0 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  =0).   && sqlite
24800 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
24810 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
24820 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53  ==0 .   && pageS
24830 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
24840 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61  =(u32)pPager->pa
24850 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  geSize .  ){.   
24860 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55   char *pNew = NU
24870 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  LL;             
24880 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
24890 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
248a0 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  te = 0;..    if(
248b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
248c0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73  PAGER_OPEN && is
248d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
248e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
248f0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
24900 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
24910 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
24920 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24930 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  K ){.      pNew 
24940 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
24950 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
24960 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
24970 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51   !pNew ) rc = SQ
24980 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
24990 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
249a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
249b0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
249c0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
249d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
249e0 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
249f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
24a00 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
24a10 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
24a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24a30 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
24a40 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
24a50 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ce);.      pPage
24a60 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
24a70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65  New;.      pPage
24a80 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e  r->dbSize = (Pgn
24a90 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69  o)((nByte+pageSi
24aa0 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b  ze-1)/pageSize);
24ab0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
24ac0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
24ad0 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ze;.    }else{. 
24ae0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
24af0 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  Free(pNew);.    
24b00 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53  }.  }..  *pPageS
24b10 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
24b20 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63  geSize;.  if( rc
24b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24b40 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
24b50 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
24b60 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
24b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
24b80 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
24b90 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
24ba0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
24bb0 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
24bc0 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
24bd0 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
24be0 20 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c      pagerFixMapl
24bf0 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  imit(pPager);.  
24c00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24c10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
24c20 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24c30 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22  "temporary page"
24c40 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74   buffer held int
24c50 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68  ernally.** by th
24c60 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69  e pager.  This i
24c70 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20  s a buffer that 
24c80 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
24c90 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74   hold the.** ent
24ca0 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ire content of a
24cb0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
24cc0 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20   This buffer is 
24cd0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  used internally.
24ce0 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ** during rollba
24cf0 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f  ck and will be o
24d00 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65  verwritten whene
24d10 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ver a rollback.*
24d20 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f  * occurs.  But o
24d30 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65  ther modules are
24d40 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20   free to use it 
24d50 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  too, as long as.
24d60 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20  ** no rollbacks 
24d70 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a  are happening..*
24d80 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
24d90 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61  agerTempSpace(Pa
24da0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
24db0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
24dc0 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a  TmpSpace;.}../*.
24dd0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
24de0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
24df0 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
24e00 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
24e10 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
24e20 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
24e30 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
24e40 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
24e50 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
24e60 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
24e70 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
24e80 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
24e90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
24ea0 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
24eb0 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
24ec0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
24ed0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
24ee0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
24ef0 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
24f00 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
24f10 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
24f20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
24f30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
24f40 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
24f50 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
24f60 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
24f70 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f  R_OPEN );      /
24f80 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79  * Called only by
24f90 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a   OP_MaxPgcnt */.
24fa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24fb0 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72  ->mxPgno>=pPager
24fc0 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20  ->dbSize );  /* 
24fd0 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f  OP_MaxPgcnt enfo
24fe0 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72  rces this */.  r
24ff0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
25000 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
25010 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
25020 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
25030 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
25040 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
25050 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
25060 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
25070 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
25080 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
25090 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
250a0 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
250b0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
250c0 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
250d0 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
250e0 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
250f0 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
25100 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
25110 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
25120 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
25130 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
25140 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
25150 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
25160 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
25170 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
25180 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
25190 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
251a0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
251b0 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
251c0 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
251d0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
251e0 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
251f0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
25200 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
25210 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
25220 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
25230 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
25240 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
25250 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
25260 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
25270 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
25280 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
25290 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
252a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
252b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
252c0 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
252d0 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
252e0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
252f0 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
25300 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
25310 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
25320 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  If the pager was
25330 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61   opened on a tra
25340 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69  nsient file (zFi
25350 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a  lename==""), or.
25360 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66  ** opened on a f
25370 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20  ile less than N 
25380 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
25390 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
253a0 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e   is.** zeroed an
253b0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
253c0 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e  rned. The ration
253d0 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20  ale for this is 
253e0 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75  that this .** fu
253f0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
25400 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
25410 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e  headers, and a n
25420 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a  ew transient or.
25430 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61  ** zero sized da
25440 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61  tabase has a hea
25450 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74  der than consist
25460 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65  s entirely of ze
25470 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  roes..**.** If a
25480 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72  ny IO error apar
25490 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f  t from SQLITE_IO
254a0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69  ERR_SHORT_READ i
254b0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a  s encountered,.*
254c0 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
254d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
254e0 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74  the caller and t
254f0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
25500 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
25510 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  fer undefined..*
25520 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
25530 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
25540 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25550 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
25560 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
25570 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25580 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
25590 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
255a0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
255b0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
255c0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
255d0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
255e0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
255f0 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69   by btree immedi
25600 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61  ately after crea
25610 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61  ting.  ** the Pa
25620 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  ger object.  The
25630 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  re has not been 
25640 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
25650 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a  o transition.  *
25660 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65  * to WAL mode ye
25670 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
25680 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
25690 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
256a0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
256b0 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  fd) ){.    IOTRA
256c0 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
256d0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
256e0 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
256f0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
25700 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
25710 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
25720 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
25730 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
25740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25750 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
25760 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25770 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
25780 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
25790 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72  d when a read-tr
257a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
257b0 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  n on.** the page
257c0 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  r. It returns th
257d0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
257e0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
257f0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48  atabase..**.** H
25800 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66  owever, if the f
25810 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31  ile is between 1
25820 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e   and <page-size>
25830 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
25840 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73  then .** this is
25850 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20   considered a 1 
25860 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  page file..*/.vo
25870 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  id sqlite3PagerP
25880 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
25890 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
258a0 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
258b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
258c0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
258d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
258e0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
258f0 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
25900 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28  );.  *pnPage = (
25910 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69  int)pPager->dbSi
25920 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  ze;.}.../*.** Tr
25930 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
25940 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74  ck of type lockt
25950 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ype on the datab
25960 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20  ase file. If.** 
25970 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65  a similar or gre
25980 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ater lock is alr
25990 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20  eady held, this 
259a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
259b0 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  -op.** (returnin
259c0 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65  g SQLITE_OK imme
259d0 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  diately)..**.** 
259e0 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d  Otherwise, attem
259f0 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  pt to obtain the
25a00 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69   lock using sqli
25a10 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76  te3OsLock(). Inv
25a20 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79  oke .** the busy
25a30 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
25a40 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74   lock is current
25a50 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
25a60 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74  . Repeat .** unt
25a70 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
25a80 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c  back returns fal
25a90 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
25aa0 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f  attempt to .** o
25ab0 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73  btain the lock s
25ac0 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
25ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
25ae0 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
25af0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
25b00 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
25b10 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66  .** the lock. If
25b20 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74   the lock is obt
25b30 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  ained successful
25b40 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ly, set the Page
25b50 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69  r.state .** vari
25b60 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  able to locktype
25b70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
25b80 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
25b90 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
25ba0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
25bb0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
25bc0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
25bf0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
25c00 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
25c10 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d   is either a no-
25c20 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20  op (because the 
25c30 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69  requested lock i
25c40 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  s .  ** already 
25c50 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66  held), or one of
25c60 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73   the transitions
25c70 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68   that the busy-h
25c80 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20  andler.  ** may 
25c90 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e  be invoked durin
25ca0 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  g, according to 
25cb0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
25cc0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
25cd0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
25ce0 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
25cf0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
25d00 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20  ck>=locktype).  
25d10 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
25d20 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
25d30 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
25d40 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
25d50 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
25d60 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
25d70 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45  K && locktype==E
25d80 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
25d90 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
25da0 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
25db0 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70  (pPager, locktyp
25dc0 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  e);.  }while( rc
25dd0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
25de0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
25df0 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
25e00 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
25e10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
25e20 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
25e30 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
25e40 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
25e50 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e  ) checks that on
25e60 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
25e70 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66  lowing is true f
25e80 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  or all dirty pag
25e90 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
25ea0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a  the page-cache:.
25eb0 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70  **.**   a) The p
25ec0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  age number is le
25ed0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
25ee0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
25ef0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  the .**      cur
25f00 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d  rent database im
25f10 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f  age, in pages, O
25f20 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20  R.**.**   b) if 
25f30 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
25f40 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74   were written at
25f50 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77   this time, it w
25f60 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
25f70 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
25f80 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
25f90 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74  nt content out t
25fa0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
25fb0 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65  l.**      (as de
25fc0 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63  termined by func
25fd0 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65  tion subjRequire
25fe0 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  sPage())..**.** 
25ff0 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  If the condition
26000 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69   asserted by thi
26010 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20  s function were 
26020 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68  not true, and th
26030 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
26040 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61  were to be disca
26050 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  rded from the ca
26060 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65  che via the page
26070 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75  rStress().** rou
26080 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73  tine, pagerStres
26090 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72  s() would not wr
260a0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
260b0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a  page content to.
260c0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
260d0 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70  file. If a savep
260e0 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
260f0 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63   were rolled bac
26100 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20  k after.** this 
26110 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f  happened, the co
26120 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77  rrect behavior w
26130 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
26140 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
26150 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
26160 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
26170 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
26180 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
26190 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
261a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
261b0 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
261c0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
261d0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
261e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
261f0 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
26200 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
26210 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
26220 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
26230 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
26240 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
26250 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
26260 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
26270 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
26280 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
26290 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
262a0 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
262b0 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
262c0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
262d0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
262e0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
262f0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
26300 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
26310 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
26320 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
26330 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
26340 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
26350 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
26360 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
26370 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26380 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
26390 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
263a0 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
263b0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
263c0 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
263d0 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
263e0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
263f0 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
26400 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
26410 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
26420 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
26430 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
26440 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
26450 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
26460 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
26470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26480 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
26490 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
264a0 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
264b0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
264c0 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
264d0 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
264e0 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
264f0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
26500 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
26510 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
26520 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
26530 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
26540 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
26550 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
26560 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63  * Once this func
26570 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61  tion has been ca
26580 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61  lled, the transa
26590 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65  ction must eithe
265a0 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  r be.** rolled b
265b0 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64  ack or committed
265c0 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65  . It is not safe
265d0 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
265e0 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68  nction and.** th
265f0 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74  en continue writ
26600 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
26610 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ase..*/.void sql
26620 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
26630 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
26640 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
26650 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
26660 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
26670 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
26680 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
26690 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
266a0 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
266b0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
266c0 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  e;..  /* At one 
266d0 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68  point the code h
266e0 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72  ere called asser
266f0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26700 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e  int() to.  ** en
26710 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61  sure that all pa
26720 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61  ges being trunca
26730 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73  ted away by this
26740 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a   operation are,.
26750 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d    ** if one or m
26760 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ore savepoints a
26770 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74  re open, present
26780 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e   in the savepoin
26790 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  t .  ** journal 
267a0 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
267b0 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20   be restored if 
267c0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
267d0 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63   rolled.  ** bac
267e0 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f  k. This is no lo
267f0 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61  nger necessary a
26800 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
26810 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a  is now only.  **
26820 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
26830 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
26840 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53  a transaction. S
26850 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a  o although the .
26860 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    ** Pager objec
26870 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65  t may still have
26880 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
26890 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
268a0 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68  nt!=0), .  ** th
268b0 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  ey cannot be rol
268c0 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65  led back. So the
268d0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
268e0 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c  onstraint() call
268f0 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  .  ** is no long
26900 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d  er correct. */.}
26910 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
26920 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
26930 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
26940 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
26950 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a   rollback. It.**
26960 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e   syncs the journ
26970 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c  al file to disk,
26980 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65   then sets pPage
26990 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f  r->journalHdr to
269a0 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20   the.** size of 
269b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
269c0 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
269d0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
269e0 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74  utine knows.** t
269f0 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a  hat the entire j
26a00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
26a10 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  been synced..**.
26a20 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74  ** Syncing a hot
26a30 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b  -journal to disk
26a40 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
26a50 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  ng to roll it ba
26a60 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74  ck ensures .** t
26a70 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66  hat if a power-f
26a80 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75  ailure occurs du
26a90 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
26aa0 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  k, the process t
26ab0 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  hat.** attempts 
26ac0 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
26ad0 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65  ng system recove
26ae0 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65  ry sees the same
26af0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74   journal.** cont
26b00 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63  ent as this proc
26b10 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ess..**.** If ev
26b20 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73  erything goes as
26b30 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45   planned, SQLITE
26b40 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
26b50 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
26b60 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
26b70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
26b80 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74  int pagerSyncHot
26b90 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
26ba0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
26bb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26bc0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
26bd0 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
26be0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
26bf0 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
26c00 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
26c10 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
26c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
26c30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
26c40 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
26c50 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d, &pPager->jour
26c60 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  nalHdr);.  }.  r
26c70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26c80 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65  ** Obtain a refe
26c90 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72  rence to a memor
26ca0 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62  y mapped page ob
26cb0 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75  ject for page nu
26cc0 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54  mber pgno. .** T
26cd0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69  he new object wi
26ce0 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74  ll use the point
26cf0 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e  er pData, obtain
26d00 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29  ed from xFetch()
26d10 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  ..** If successf
26d20 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20  ul, set *ppPage 
26d30 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
26d40 6e 65 77 20 70 61 67 65 20 72 65 66 65 72 65 6e  new page referen
26d50 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ce.** and return
26d60 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
26d70 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
26d80 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
26d90 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70  de and set.** *p
26da0 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a  pPage to zero..*
26db0 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65  *.** Page refere
26dc0 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79  nces obtained by
26dd0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
26de0 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
26df0 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20   released.** by 
26e00 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c  calling pagerRel
26e10 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  easeMapPage()..*
26e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
26e30 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
26e40 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
26e50 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
26e60 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
26e70 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ect */.  Pgno pg
26e80 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
26e90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
26ea0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69   number */.  voi
26eb0 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  d *pData,       
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ed0 78 46 65 74 63 68 28 29 27 64 20 64 61 74 61 20  xFetch()'d data 
26ee0 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
26ef0 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67  .  PgHdr **ppPag
26f00 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
26f10 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69     /* OUT: Acqui
26f20 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20  red page object 
26f30 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  */.){.  PgHdr *p
26f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26f50 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
26f60 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f  y mapped page to
26f70 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20   return */.  .  
26f80 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  if( pPager->pMma
26f90 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20  pFreelist ){.   
26fa0 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70   *ppPage = p = p
26fb0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26fc0 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  list;.    pPager
26fd0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
26fe0 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
26ff0 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a   p->pDirty = 0;.
27000 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45      memset(p->pE
27010 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  xtra, 0, pPager-
27020 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73  >nExtra);.  }els
27030 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
27040 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71   p = (PgHdr *)sq
27050 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
27060 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20  sizeof(PgHdr) + 
27070 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
27080 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  .    if( p==0 ){
27090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
270a0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
270b0 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31  fd, (i64)(pgno-1
270c0 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) * pPager->page
270d0 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
270e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
270f0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
27100 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72    }.    p->pExtr
27110 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31  a = (void *)&p[1
27120 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  ];.    p->flags 
27130 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20  = PGHDR_MMAP;.  
27140 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
27150 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70     p->pPager = p
27160 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73  Pager;.  }..  as
27170 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d  sert( p->pExtra=
27180 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29  =(void *)&p[1] )
27190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
271a0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Page==0 );.  ass
271b0 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50  ert( p->flags==P
271c0 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61  GHDR_MMAP );.  a
271d0 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72  ssert( p->pPager
271e0 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ==pPager );.  as
271f0 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31  sert( p->nRef==1
27200 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d   );..  p->pgno =
27210 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74   pgno;.  p->pDat
27220 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61  a = pData;.  pPa
27230 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b  ger->nMmapOut++;
27240 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
27250 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
27260 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
27270 63 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20  ce to page pPg. 
27280 70 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65  pPg must have be
27290 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  en returned by a
272a0 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61  n .** earlier ca
272b0 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69  ll to pagerAcqui
272c0 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a  reMapPage()..*/.
272d0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
272e0 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
272f0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
27300 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
27310 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50  Pg->pPager;.  pP
27320 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d  ager->nMmapOut--
27330 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ;.  pPg->pDirty 
27340 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
27350 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65  reelist;.  pPage
27360 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27370 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72   = pPg;..  asser
27380 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  t( pPager->fd->p
27390 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
273a0 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65  n>=3 );.  sqlite
273b0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
273c0 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67  r->fd, (i64)(pPg
273d0 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72  ->pgno-1)*pPager
273e0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d  ->pageSize, pPg-
273f0 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pData);.}../*.*
27400 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72  * Free all PgHdr
27410 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20   objects stored 
27420 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d  in the Pager.pMm
27430 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e  apFreelist list.
27440 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27450 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73  pagerFreeMapHdrs
27460 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
27470 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50  .  PgHdr *p;.  P
27480 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66  gHdr *pNext;.  f
27490 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d  or(p=pPager->pMm
274a0 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70  apFreelist; p; p
274b0 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
274c0 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  xt = p->pDirty;.
274d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
274e0 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  (p);.  }.}.../*.
274f0 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
27500 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
27510 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
27520 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
27530 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
27540 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
27550 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
27560 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
27570 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
27580 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
27590 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
275a0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
275b0 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
275c0 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
275d0 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
275e0 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
275f0 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
27600 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
27610 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
27620 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
27630 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
27640 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
27650 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
27660 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
27670 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
27680 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
27690 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
276a0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
276b0 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
276c0 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
276d0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
276e0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
276f0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
27700 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
27710 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
27720 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
27730 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
27740 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
27750 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
27760 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
27770 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38    u8 *pTmp = (u8
27780 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
27790 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pace;..  assert(
277a0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
277b0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
277c0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
277d0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
277e0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
277f0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
27800 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73  pagerFreeMapHdrs
27810 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70  (pPager);.  /* p
27820 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
27830 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
27840 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
27850 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
27860 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
27870 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
27880 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67  ager->pWal, pPag
27890 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
278a0 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  s, pPager->pageS
278b0 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50  ize, pTmp);.  pP
278c0 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
278d0 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
278e0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
278f0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
27900 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
27910 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
27920 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
27930 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a  open, sync the j
27940 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
27950 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63  re calling Unloc
27960 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20  kAndRollback..  
27970 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
27980 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61  not done, then a
27990 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  n unsynced porti
279a0 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  on of the open j
279b0 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66  ournal .    ** f
279c0 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65  ile may be playe
279d0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
279e0 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
279f0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
27a00 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c  urs .    ** whil
27a10 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  e this is happen
27a20 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
27a30 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e could become c
27a40 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20  orrupt..    **. 
27a50 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f     ** If an erro
27a60 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
27a70 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68  rying to sync th
27a80 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74  e journal, shift
27a90 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
27aa0 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52  * into the ERROR
27ab0 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75   state. This cau
27ac0 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ses UnlockAndRol
27ad0 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20  lback to unlock 
27ae0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
27af0 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ase and close th
27b00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
27b10 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e  ithout attemptin
27b20 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20  g to roll it.   
27b30 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61   ** back or fina
27b40 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78  lize it. The nex
27b50 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20  t database user 
27b60 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20  will have to do 
27b70 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot-journal.    
27b80 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f  ** rollback befo
27b90 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
27ba0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
27bb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
27bc0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27bd0 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  d) ){.      page
27be0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
27bf0 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
27c00 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20  nal(pPager));.  
27c10 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c    }.    pagerUnl
27c20 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
27c30 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
27c40 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
27c50 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
27c60 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
27c70 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
27c80 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
27c90 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
27ca0 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
27cb0 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
27cc0 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
27cd0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
27ce0 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  ->jfd);.  sqlite
27cf0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
27d00 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  >fd);.  sqlite3P
27d10 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20  ageFree(pTmp);. 
27d20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
27d30 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ose(pPager->pPCa
27d40 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  che);..#ifdef SQ
27d50 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
27d60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
27d70 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
27d80 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
27d90 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65  ger->pCodec);.#e
27da0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
27db0 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  !pPager->aSavepo
27dc0 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  int && !pPager->
27dd0 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
27de0 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
27df0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
27e00 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
27e10 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69  sjfd) );..  sqli
27e20 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
27e30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
27e40 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
27e50 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
27e60 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
27e70 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
27e80 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
27e90 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  er for page pPg.
27ea0 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
27eb0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
27ec0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
27ed0 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f  return pPg->pgno
27ee0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
27ef0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
27f00 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
27f10 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
27f20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
27f30 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
27f40 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
27f50 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a  cheRef(pPg);.}..
27f60 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
27f70 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72  ournal. In other
27f80 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
27f90 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
27fa0 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
27fb0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
27fc0 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
27fd0 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
27fe0 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
27ff0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61  e.** disk and ca
28000 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e  n be restored in
28010 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
28020 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
28030 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
28040 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
28050 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
28060 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
28070 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f  is a no-op..** O
28080 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
28090 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
280a0 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
280b0 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68  rnal-mode and th
280c0 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61  e .** device cha
280d0 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20  racteristics of 
280e0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
280f0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
28100 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
28110 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
28120 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
28130 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
28140 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
28150 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
28160 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
28170 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
28180 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
28190 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
281a0 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
281b0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
281c0 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
281d0 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
281e0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
281f0 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
28200 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
28210 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
28220 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
28230 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
28240 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
28250 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
28260 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
28270 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
28280 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
28290 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
282a0 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
282b0 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
282c0 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
282d0 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
282e0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
282f0 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
28300 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
28310 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
28320 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
28330 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
28340 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
28350 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
28360 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
28370 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
28380 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
28390 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
283a0 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
283b0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
283c0 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
283d0 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
283e0 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
283f0 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
28400 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
28410 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
28420 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75     }.**.** If su
28430 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72  ccessful, this r
28440 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
28450 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
28460 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20  C flag of every 
28470 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74  .** page current
28480 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ly held in memor
28490 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
284a0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
284b0 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
284c0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
284d0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
284e0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
284f0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
28500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28510 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
28520 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
28530 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63  ewHdr){.  int rc
28540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
28560 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
28570 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
28580 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
28590 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
285a0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
285b0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
285c0 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
285d0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
285e0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
285f0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
28600 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
28610 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  ager) );..  rc =
28620 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
28630 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
28640 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
28650 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
28660 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
28670 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
28680 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
28690 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
286a0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
286b0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
286c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
286d0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
286e0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
286f0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
28700 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
28710 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
28720 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
28730 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28740 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
28750 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
28760 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
28770 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
28780 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
28790 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
287a0 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
287b0 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
287c0 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
287d0 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
287e0 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
287f0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
28800 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
28810 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
28820 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
28830 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
28840 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
28850 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
28860 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
28870 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
28880 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
28890 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
288a0 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
288b0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
288c0 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
288d0 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
288e0 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
288f0 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
28900 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
28910 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
28920 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
28930 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
28940 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
28950 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
28960 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
28970 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
28980 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
28990 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
289a0 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
289b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
289c0 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
289d0 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
289e0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
289f0 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
28a00 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
28a10 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
28a20 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
28a30 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
28a40 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
28a50 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
28a60 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
28a70 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
28a80 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
28a90 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
28aa0 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
28ab0 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
28ac0 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
28ad0 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
28ae0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
28af0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
28b00 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28b10 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
28b20 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
28b30 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
28b40 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
28b50 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
28b60 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
28b70 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
28b80 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
28b90 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
28ba0 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
28bb0 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
28bc0 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
28bd0 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
28be0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28bf0 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
28c00 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
28c10 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
28c20 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
28c30 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
28c40 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
28c50 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
28c60 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
28c70 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
28c80 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
28c90 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
28ca0 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
28cb0 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
28cc0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
28cd0 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
28ce0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
28cf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
28d00 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
28d10 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
28d20 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
28d30 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
28d40 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
28d50 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
28d60 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
28d70 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
28d80 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
28d90 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
28da0 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
28db0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
28dc0 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
28dd0 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
28de0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
28df0 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
28e00 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
28e10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28e20 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
28e30 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
28e40 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
28e50 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
28e60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
28e70 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
28e80 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
28e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
28ea0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
28eb0 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
28ec0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28ed0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
28ee0 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
28ef0 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
28f00 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
28f10 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28f20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
28f30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
28f40 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
28f50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
28f60 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
28f70 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
28f80 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
28f90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28fa0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
28fb0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
28fc0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
28fd0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
28fe0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
28ff0 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
29000 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
29010 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
29020 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
29030 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
29040 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
29050 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
29060 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
29070 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
29080 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
29090 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
290a0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
290b0 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
290c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
290d0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
290e0 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
290f0 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
29100 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
29110 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
29120 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
29130 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
29140 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
29150 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
29160 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
29170 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
29180 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
29190 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
291a0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
291b0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
291c0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
291d0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
291e0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
291f0 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
29200 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
29210 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
29220 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
29230 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
29240 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
29250 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
29260 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
29270 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
29280 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
29290 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
292a0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
292b0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
292c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
292d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
292e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
292f0 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
29300 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
29310 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
29320 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
29330 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
29340 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
29350 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
29360 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
29370 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
29380 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
29390 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
293a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
293b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
293c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
293d0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
293e0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
293f0 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
29400 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
29410 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
29420 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
29430 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
29440 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
29450 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
29460 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
29470 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
29480 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
29490 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20  ger->syncFlags| 
294a0 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
294b0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53  er->syncFlags==S
294c0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
294d0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
294e0 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
294f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
29510 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29520 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  }..      pPager-
29530 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
29540 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
29550 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48  ;.      if( newH
29560 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  dr && 0==(iDc&SQ
29570 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
29580 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
29590 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
295a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
295b0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
295c0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
295d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
295e0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
295f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
29600 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
29610 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
29620 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
29630 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
29640 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   /* Unless the p
29650 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e  ager is in noSyn
29660 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
29670 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
29680 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  t .  ** successf
29690 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74  ully synced. Eit
296a0 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74  her way, clear t
296b0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
296c0 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a  NC flag on .  **
296d0 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f   all pages..  */
296e0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
296f0 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
29700 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
29710 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
29720 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
29730 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74  _DBMOD;.  assert
29740 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
29750 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
29760 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29770 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
29780 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
29790 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
297a0 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
297b0 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
297c0 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
297d0 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
297e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
297f0 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
29800 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
29810 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
29820 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
29830 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
29840 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
29850 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
29860 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
29870 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
29880 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29890 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
298a0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
298b0 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
298c0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
298d0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
298e0 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
298f0 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
29900 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
29910 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
29920 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
29930 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
29940 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
29950 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
29960 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
29970 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
29980 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
29990 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
299a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
299b0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
299c0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
299d0 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
299e0 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
299f0 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
29a00 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
29a10 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
29a20 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
29a30 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
29a40 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
29a50 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
29a60 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
29a70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
29a80 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
29a90 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
29aa0 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
29ab0 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
29ac0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
29ad0 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
29ae0 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
29af0 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
29b00 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
29b10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
29b20 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
29b30 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
29b40 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
29b50 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
29b60 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
29b70 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
29b80 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
29b90 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
29ba0 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
29bb0 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
29bc0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
29bd0 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
29be0 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
29bf0 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
29c00 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
29c10 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
29c20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
29c30 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
29c40 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
29c50 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
29c60 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
29c70 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
29c80 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
29c90 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
29ca0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
29cb0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29cc0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
29cd0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
29ce0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
29cf0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
29d00 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
29d10 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
29d20 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
29d30 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
29d40 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
29d50 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
29d60 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
29d70 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
29d80 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
29d90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
29da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29db0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
29dc0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
29dd0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
29de0 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
29df0 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
29e00 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
29e10 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
29e20 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
29e30 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29e40 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
29e50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
29e60 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
29e70 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  _DBMOD );.  asse
29e80 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
29e90 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
29ea0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  K );.  assert( i
29eb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
29ec0 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72  ) || pList->pDir
29ed0 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
29ee0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20  f the file is a 
29ef0 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f  temp-file has no
29f00 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
29f10 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
29f20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  It.  ** is not p
29f30 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74  ossible for rc t
29f40 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20  o be other than 
29f50 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69  SQLITE_OK if thi
29f60 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73  s branch.  ** is
29f70 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72   taken, as pager
29f80 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20  _wait_on_lock() 
29f90 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
29fa0 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a  emp-files..  */.
29fb0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
29fc0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
29fd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29fe0 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d  >tempFile && rc=
29ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2a000 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
2a010 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
2a020 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
2a030 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  >vfsFlags);.  }.
2a040 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65  .  /* Before the
2a050 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69   first write, gi
2a060 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e  ve the VFS a hin
2a070 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69  t of what the fi
2a080 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69  nal.  ** file si
2a090 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f  ze will be..  */
2a0a0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
2a0b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
2a0c0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2a0d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2a0e0 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61  TE_OK .   && pPa
2a0f0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c  ger->dbHintSize<
2a100 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20  pPager->dbSize. 
2a110 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69    && (pList->pDi
2a120 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67  rty || pList->pg
2a130 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  no>pPager->dbHin
2a140 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20  tSize).  ){.    
2a150 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
2a160 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  File = pPager->p
2a170 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74  ageSize * (sqlit
2a180 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d  e3_int64)pPager-
2a190 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  >dbSize;.    sql
2a1a0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
2a1b0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
2a1c0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
2a1d0 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c  IZE_HINT, &szFil
2a1e0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
2a1f0 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
2a200 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
2a210 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
2a220 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
2a230 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
2a240 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
2a250 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2a260 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
2a270 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
2a280 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
2a290 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
2a2a0 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
2a2b0 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
2a2c0 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
2a2d0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
2a2e0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
2a2f0 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
2a300 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
2a310 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
2a320 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
2a330 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
2a340 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
2a350 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
2a360 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
2a370 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
2a380 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
2a390 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
2a3a0 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
2a3b0 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
2a3c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
2a3d0 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
2a3e0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
2a3f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
2a400 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
2a410 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
2a420 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
2a430 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
2a440 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
2a450 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
2a460 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
2a470 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
2a480 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4a0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
2a4b0 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
2a4c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2a4d0 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
2a4e0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
2a4f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
2a500 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
2a510 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
2a520 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
2a530 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64  ..      /* Encod
2a540 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  e the database *
2a550 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  /.      CODEC2(p
2a560 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
2a570 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65  ata, pgno, 6, re
2a580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2a590 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a  M_BKPT, pData);.
2a5a0 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
2a5b0 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74  out the page dat
2a5c0 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  a. */.      rc =
2a5d0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2a5e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
2a5f0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
2a600 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ize, offset);.. 
2a610 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20       /* If page 
2a620 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74  1 was just writt
2a630 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72  en, update Pager
2a640 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d  .dbFileVers to m
2a650 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  atch.      ** th
2a660 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72  e value now stor
2a670 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
2a680 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74  se file. If writ
2a690 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20  ing this .      
2a6a0 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74  ** page caused t
2a6b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a6c0 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65   to grow, update
2a6d0 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20   dbFileSize. .  
2a6e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2a6f0 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
2a700 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2a710 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
2a720 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
2a730 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
2a740 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
2a750 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
2a760 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2a770 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ze ){.        pP
2a780 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2a790 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d   = pgno;.      }
2a7a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
2a7b0 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
2a7c0 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20  WRITE]++;..     
2a7d0 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
2a7e0 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
2a7f0 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
2a800 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
2a810 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
2a820 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
2a830 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
2a840 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
2a850 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
2a860 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2a870 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
2a880 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2a8b0 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
2a8c0 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
2a8d0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
2a8e0 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
2a8f0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
2a900 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
2a910 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
2a920 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
2a930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a940 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
2a950 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
2a960 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2a970 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
2a980 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
2a990 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  t_pagehash(pList
2a9a0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
2a9b0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
2a9c0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2a9d0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
2a9e0 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75  that the sub-jou
2a9f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2aa00 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  n. If it is alre
2aa10 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a  ady open, this .
2aa20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
2aa30 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51   no-op..**.** SQ
2aa40 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2aa50 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
2aa60 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67  g goes according
2aa70 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a   to plan. An .**
2aa80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
2aa90 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
2aaa0 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61  returned if a ca
2aab0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f  ll to sqlite3OsO
2aac0 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e  pen() .** fails.
2aad0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
2aae0 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
2aaf0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2ab00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2ab10 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  OK;.  if( !isOpe
2ab20 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2ab30 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
2ab40 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45   flags =  SQLITE
2ab50 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
2ab60 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
2ab70 45 41 44 57 52 49 54 45 20 0a 20 20 20 20 20 20  EADWRITE .      
2ab80 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
2ab90 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
2aba0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20  EN_EXCLUSIVE .  
2abb0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
2abc0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
2abd0 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70  .    int nStmtSp
2abe0 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e  ill = sqlite3Con
2abf0 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a  fig.nStmtSpill;.
2ac00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2ac10 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2ac20 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2ac30 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
2ac40 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
2ac50 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c  .      nStmtSpil
2ac60 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  l = -1;.    }.  
2ac70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2ac80 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
2ac90 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65  ->pVfs, 0, pPage
2aca0 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20  r->sjfd, flags, 
2acb0 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d  nStmtSpill);.  }
2acc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2acd0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
2ace0 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75  record of the cu
2acf0 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70  rrent state of p
2ad00 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73  age pPg to the s
2ad10 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a  ub-journal. .**.
2ad20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2ad30 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f  , set the bit co
2ad40 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
2ad50 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20  Pg->pgno in the 
2ad60 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61  bitvecs.** for a
2ad70 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
2ad80 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ts before return
2ad90 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
2ada0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2adb0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
2adc0 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2add0 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a  essful, an IO.**
2ade0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74   error code if t
2adf0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
2ae00 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ite to the sub-j
2ae10 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
2ae20 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
2ae30 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
2ae40 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e  ils while settin
2ae50 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76  g a bit in a sav
2ae60 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63  epoint.** bitvec
2ae70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ae80 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50  subjournalPage(P
2ae90 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e  gHdr *pPg){.  in
2aea0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2aeb0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2aec0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2aed0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
2aee0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2aef0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2af00 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  F ){..    /* Ope
2af10 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
2af20 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  l, if it has not
2af30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
2af40 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65  ened */.    asse
2af50 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2af60 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73  ournal );.    as
2af70 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2af80 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67  ger->jfd) || pag
2af90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2afa0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2afb0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2afc0 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
2afd0 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20  nSubRec==0 );.  
2afe0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
2aff0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20  seWal(pPager) . 
2b000 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49          || pageI
2b010 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  nJournal(pPager,
2b020 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20   pPg) .         
2b030 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
2b040 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2b050 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2b060 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2b070 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
2b080 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
2b090 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
2b0a0 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
2b0b0 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
2b0c0 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
2b0d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
2b0e0 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
2b0f0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
2b100 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b110 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
2b120 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
2b130 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
2b140 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e  = (i64)pPager->n
2b150 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
2b160 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
2b170 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
2b180 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
2b190 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
2b1a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
2b1b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b1c0 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29 3b  M_BKPT, pData2);
2b1d0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
2b1e0 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
2b1f0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2b200 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2b210 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
2b220 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
2b230 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
2b240 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
2b250 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2b260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b270 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2b280 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2b290 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
2b2a0 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
2b2b0 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
2b2c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b2d0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2b2e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
2b2f0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
2b300 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2b310 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
2b320 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
2b330 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2b340 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
2b350 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
2b360 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
2b370 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
2b380 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 50  PageIfRequired(P
2b390 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
2b3a0 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
2b3b0 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72  ge(pPg) ){.    r
2b3c0 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c  eturn subjournal
2b3d0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
2b3e0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
2b3f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
2b400 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2b410 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
2b420 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
2b430 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
2b440 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
2b450 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
2b460 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
2b470 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
2b480 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
2b490 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
2b4a0 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
2b4b0 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
2b4c0 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
2b4d0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
2b4e0 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
2b4f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
2b500 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2b510 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
2b520 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
2b530 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
2b540 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2b550 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
2b560 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
2b570 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2b580 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
2b590 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
2b5a0 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
2b5b0 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
2b5c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2b5d0 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
2b5e0 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
2b5f0 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
2b600 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2b610 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
2b620 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
2b630 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
2b640 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
2b650 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
2b660 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
2b670 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2b680 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
2b690 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
2b6a0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2b6b0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2b6c0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
2b6d0 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
2b6e0 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
2b6f0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
2b700 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
2b710 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
2b720 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
2b730 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
2b740 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
2b750 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
2b760 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
2b770 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
2b780 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2b790 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
2b7a0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
2b7b0 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
2b7c0 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
2b7d0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
2b7e0 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
2b7f0 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
2b800 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2b810 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
2b820 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
2b830 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
2b840 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
2b850 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e  );..  /* The doN
2b860 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62  otSpill NOSYNC b
2b870 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  it is set during
2b880 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e   times when doin
2b890 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a  g a sync of.  **
2b8a0 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64   journal (and ad
2b8b0 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65  ding a new heade
2b8c0 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  r) is not allowe
2b8d0 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a  d.  This occurs.
2b8e0 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c    ** during call
2b8f0 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
2b900 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74  rWrite() while t
2b910 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c  rying to journal
2b920 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70   multiple.  ** p
2b930 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74  ages belonging t
2b940 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  o the same secto
2b950 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
2b960 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c   doNotSpill ROLL
2b970 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74  BACK and OFF bit
2b980 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63  s inhibits all c
2b990 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20  ache spilling.  
2b9a0 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ** regardless of
2b9b0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2b9c0 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  a sync is requir
2b9d0 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74  ed.  This is set
2b9e0 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72   during.  ** a r
2b9f0 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73  ollback or by us
2ba00 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73 70  er request, resp
2ba10 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20  ectively..  **. 
2ba20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20   ** Spilling is 
2ba30 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20  also prohibited 
2ba40 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72  when in an error
2ba50 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61   state since tha
2ba60 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61  t could.  ** lea
2ba70 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
2ba80 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74  rruption.   In t
2ba90 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
2baa0 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20  mentation it .  
2bab0 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  ** is impossible
2bac0 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63   for sqlite3Pcac
2bad0 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20  heFetch() to be 
2bae0 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61  called with crea
2baf0 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77  teFlag==3.  ** w
2bb00 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f  hile in the erro
2bb10 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69  r state, hence i
2bb20 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  t is impossible 
2bb30 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
2bb40 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c   to.  ** be call
2bb50 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  ed in the error 
2bb60 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65  state.  Neverthe
2bb70 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65  less, we include
2bb80 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20   a NEVER().  ** 
2bb90 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72  test for the err
2bba0 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61  or state as a sa
2bbb0 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  feguard against 
2bbc0 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a  future changes..
2bbd0 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
2bbe0 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2bbf0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
2bc00 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65  E_OK;.  testcase
2bc10 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2bc20 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2bc30 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74  _ROLLBACK );.  t
2bc40 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2bc50 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2bc60 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20  ILLFLAG_OFF );. 
2bc70 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2bc80 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2bc90 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43  SPILLFLAG_NOSYNC
2bca0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2bcb0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20  ->doNotSpill.   
2bcc0 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e  && ((pPager->doN
2bcd0 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c  otSpill & (SPILL
2bce0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50  FLAG_ROLLBACK|SP
2bcf0 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30  ILLFLAG_OFF))!=0
2bd00 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e  .      || (pPg->
2bd10 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
2bd20 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29  ED_SYNC)!=0).  )
2bd30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2bd40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
2bd50 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
2bd60 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
2bd70 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
2bd80 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
2bd90 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
2bda0 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
2bdb0 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
2bdc0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52  ubjournalPageIfR
2bdd0 65 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a 20  equired(pPg); . 
2bde0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bdf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2be00 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
2be10 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
2be20 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
2be30 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53  lse{.  .    /* S
2be40 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2be50 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
2be60 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
2be70 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2be80 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c  ED_SYNC .     ||
2be90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2bea0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
2beb0 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20  CHEMOD.    ){.  
2bec0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
2bed0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b  rnal(pPager, 1);
2bee0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2bef0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
2bf00 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2bf10 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2bf20 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
2bf30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bf40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2bf50 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  rt( (pPg->flags&
2bf60 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2bf70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
2bf80 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
2bf90 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70  gelist(pPager, p
2bfa0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
2bfb0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
2bfc0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
2bfd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bfe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
2bff0 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
2c000 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2c010 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2c020 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
2c030 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2c040 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
2c050 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
2c060 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2c070 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  c); .}../*.** Fl
2c080 75 73 68 20 61 6c 6c 20 75 6e 72 65 66 65 72 65  ush all unrefere
2c090 6e 63 65 64 20 64 69 72 74 79 20 70 61 67 65 73  nced dirty pages
2c0a0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
2c0b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75   sqlite3PagerFlu
2c0c0 73 68 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  sh(Pager *pPager
2c0d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50  ){.  int rc = pP
2c0e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2c0f0 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
2c100 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
2c110 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
2c120 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
2c130 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 61  >pPCache);.    a
2c140 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
2c150 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
2c160 29 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) );.    while( 
2c170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c180 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
2c190 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
2c1a0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
2c1b0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
2c1c0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
2c1d0 20 20 72 63 20 3d 20 70 61 67 65 72 53 74 72 65    rc = pagerStre
2c1e0 73 73 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72  ss((void*)pPager
2c1f0 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  , pList);.      
2c200 7d 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  }.      pList = 
2c210 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
2c220 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2c230 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2c240 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2c250 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
2c260 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
2c270 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
2c280 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
2c290 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
2c2a0 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
2c2b0 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
2c2c0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2c2d0 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
2c2e0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
2c2f0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
2c300 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
2c310 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
2c320 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
2c330 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
2c340 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
2c350 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2c360 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
2c370 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
2c380 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
2c390 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
2c3a0 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
2c3b0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
2c3c0 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
2c3d0 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
2c3e0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
2c3f0 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
2c400 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
2c410 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
2c420 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
2c430 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
2c440 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
2c450 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
2c460 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
2c470 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
2c480 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
2c490 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
2c4a0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
2c4b0 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
2c4c0 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
2c4d0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
2c4e0 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
2c4f0 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
2c500 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
2c510 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
2c520 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
2c530 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
2c540 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
2c550 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
2c560 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
2c570 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
2c580 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
2c590 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
2c5a0 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
2c5b0 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
2c5c0 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  he PAGER_* flags
2c5d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46  ..**.** The vfsF
2c5e0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69  lags parameter i
2c5f0 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70  s a bitmask to p
2c600 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73  ass to the flags
2c610 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
2c620 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74   the xOpen() met
2c630 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c  hod of the suppl
2c640 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65  ied VFS when ope
2c650 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a  ning files. .**.
2c660 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
2c670 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
2c680 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63  ted and the spec
2c690 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65  ified file opene
2c6a0 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  d .** successful
2c6b0 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ly, SQLITE_OK is
2c6c0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
2c6d0 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f  pPager set to po
2c6e0 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65  int to.** the ne
2c6f0 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  w pager object. 
2c700 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2c710 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20  rs, *ppPager is 
2c720 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61  set to NULL.** a
2c730 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  nd error code re
2c740 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e  turned. This fun
2c750 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
2c760 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
2c770 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28   (sqlite3Malloc(
2c780 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  ) is used to all
2c790 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53  ocate memory), S
2c7a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f  QLITE_CANTOPEN o
2c7b0 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51  r .** various SQ
2c7c0 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f  LITE_IO_XXX erro
2c7d0 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2c7e0 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
2c7f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2c800 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
2c810 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
2c820 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
2c830 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
2c840 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2c850 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
2c860 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
2c870 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2c880 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
2c890 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2c8a0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2c8b0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
2c8c0 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
2c8d0 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
2c8e0 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
2c8f0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
2c900 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2c910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2c920 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
2c930 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2c940 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20  int vfsFlags,   
2c950 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2c960 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
2c970 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
2c980 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69  xOpen() */.  voi
2c990 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
2c9a0 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f  age*) /* Functio
2c9b0 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a  n to reinitializ
2c9c0 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  e pages */.){.  
2c9d0 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
2c9e0 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20  r *pPager = 0;  
2c9f0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
2ca00 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ject to allocate
2ca10 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2ca20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2ca30 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
2ca40 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2ca50 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20  t tempFile = 0; 
2ca60 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2ca70 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69  or temp files (i
2ca80 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  ncl. in-memory f
2ca90 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d  iles) */.  int m
2caa0 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  emDb = 0;       
2cab0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2cac0 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
2cad0 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ory file */.  in
2cae0 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
2caf0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2cb00 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
2cb10 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
2cb20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
2cb30 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
2cb40 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2cb50 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2cb60 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
2cb70 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2cb80 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
2cb90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2cba0 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
2cbb0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
2cbc0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2cbd0 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
2cbe0 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
2cbf0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
2cc00 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
2cc10 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
2cc20 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
2cc30 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20   int pcacheSize 
2cc40 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
2cc50 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20  ize();       /* 
2cc60 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2cc70 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a  e for PCache */.
2cc80 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74    u32 szPageDflt
2cc90 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2cca0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a  T_PAGE_SIZE;  /*
2ccb0 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   Default page si
2ccc0 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ze */.  const ch
2ccd0 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20  ar *zUri = 0;   
2cce0 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20   /* URI args to 
2ccf0 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  copy */.  int nU
2cd00 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ri = 0;         
2cd10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2cd20 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67  bytes of URI arg
2cd30 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20  s at *zUri */.. 
2cd40 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
2cd50 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
2cd60 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
2cd70 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
2cd80 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
2cd90 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
2cda0 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
2cdb0 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
2cdc0 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20  -journal).  */. 
2cdd0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2cde0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2cdf0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2ce00 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  s));..  /* Set t
2ce10 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
2ce20 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61  le to NULL in ca
2ce30 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
2ce40 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  rs. */.  *ppPage
2ce50 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  r = 0;..#ifndef 
2ce60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
2ce70 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73  RYDB.  if( flags
2ce80 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20   & PAGER_MEMORY 
2ce90 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  ){.    memDb = 1
2cea0 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e  ;.    if( zFilen
2ceb0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2cec0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61  [0] ){.      zPa
2ced0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2cee0 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c  DbStrDup(0, zFil
2cef0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
2cf00 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20  ( zPathname==0  
2cf10 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2cf20 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2cf30 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    nPathname = sq
2cf40 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2cf50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2cf60 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
2cf70 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2cf80 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e  .  /* Compute an
2cf90 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  d store the full
2cfa0 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20   pathname in an 
2cfb0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
2cfc0 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f   pointed.  ** to
2cfd0 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c   by zPathname, l
2cfe0 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e  ength nPathname.
2cff0 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20   Or, if this is 
2d000 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2d010 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74  ,.  ** leave bot
2d020 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20  h nPathname and 
2d030 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f  zPathname set to
2d040 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a   0..  */.  if( z
2d050 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2d060 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2d070 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
2d080 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
2d090 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2d0a0 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
2d0b0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2d0c0 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61  ocRaw(0, nPathna
2d0d0 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
2d0e0 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
2d0f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d100 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2d110 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61     }.    zPathna
2d120 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
2d130 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
2d140 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
2d150 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
2d160 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2d170 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
2d180 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
2d190 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
2d1a0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e  Pathname);.    n
2d1b0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2d1c0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2d1d0 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a  name);.    z = z
2d1e0 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65  Uri = &zFilename
2d1f0 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
2d200 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a  (zFilename)+1];.
2d210 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
2d220 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2d230 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2d240 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  ;.      z += sql
2d250 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2d260 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72  1;.    }.    nUr
2d270 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20  i = (int)(&z[1] 
2d280 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73  - zUri);.    ass
2d290 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a  ert( nUri>=0 );.
2d2a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d2b0 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
2d2c0 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
2d2d0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
2d2e0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2d2f0 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
2d300 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
2d310 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2d320 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
2d330 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
2d340 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
2d350 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
2d360 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
2d370 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
2d380 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
2d390 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
2d3a0 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
2d3b0 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
2d3c0 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
2d3d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2d3e0 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
2d3f0 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
2d400 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
2d410 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
2d420 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2d430 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2d440 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
2d450 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d460 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
2d470 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2d480 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
2d490 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
2d4a0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
2d4b0 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61  emory for the Pa
2d4c0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50  ger structure, P
2d4d0 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68  Cache object, th
2d4e0 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c  e.  ** three fil
2d4f0 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74  e descriptors, t
2d500 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d510 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f   name and the jo
2d520 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
2d530 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75   name. The layou
2d540 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61  t in memory is a
2d550 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
2d560 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f    **     Pager o
2d570 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2d580 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
2d590 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20  (Pager) bytes). 
2d5a0 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f   **     PCache o
2d5b0 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2d5c0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2d5d0 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74  PcacheSize() byt
2d5e0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2d5f0 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
2d600 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56  e            (pV
2d610 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74  fs->szOsFile byt
2d620 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62  es).  **     Sub
2d630 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61  -journal file ha
2d640 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f  ndle         (jo
2d650 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2d660 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61  tes).  **     Ma
2d670 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
2d680 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a  handle        (j
2d690 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2d6a0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2d6b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2d6c0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  e              (
2d6d0 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65  nPathname+1 byte
2d6e0 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72  s).  **     Jour
2d6f0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  nal file name   
2d700 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2d710 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73  thname+8+1 bytes
2d720 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20  ).  */.  pPtr = 
2d730 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  (u8 *)sqlite3Mal
2d740 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55  locZero(.    ROU
2d750 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2d760 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50  er)) +      /* P
2d770 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
2d780 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61  /.    ROUND8(pca
2d790 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20  cheSize) +      
2d7a0 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
2d7b0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55  bject */.    ROU
2d7c0 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2d7d0 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  le) +       /* T
2d7e0 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
2d7f0 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
2d800 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
2d810 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
2d820 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2d830 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  / .    nPathname
2d840 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20   + 1 + nUri +   
2d850 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
2d860 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
2d870 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20  ame + 8 + 2     
2d880 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
2d890 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rnal */.#ifndef 
2d8a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2d8b0 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20      + nPathname 
2d8c0 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 4 + 2         
2d8d0 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65     /* zWal */.#e
2d8e0 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65  ndif.  );.  asse
2d8f0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2d900 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
2d910 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
2d920 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
2d930 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
2d940 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2d950 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2d960 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d970 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2d980 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20  }.  pPager =    
2d990 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72            (Pager
2d9a0 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67  *)(pPtr);.  pPag
2d9b0 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20  er->pPCache =   
2d9c0 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20   (PCache*)(pPtr 
2d9d0 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
2d9e0 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70  (*pPager)));.  p
2d9f0 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73  Pager->fd =   (s
2da00 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2da10 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61  tr += ROUND8(pca
2da20 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61  cheSize));.  pPa
2da30 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c  ger->sjfd = (sql
2da40 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2da50 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d   += ROUND8(pVfs-
2da60 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70  >szOsFile));.  p
2da70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73  Pager->jfd =  (s
2da80 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2da90 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2daa0 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  eSize);.  pPager
2dab0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20  ->zFilename =   
2dac0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2dad0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2dae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2daf0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2db00 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  T(pPager->jfd) )
2db10 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2db20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e  the Pager.zFilen
2db30 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ame and Pager.zJ
2db40 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20  ournal buffers, 
2db50 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2db60 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
2db70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
2db80 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20  Pathname>0 );.  
2db90 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
2dba0 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70  al =   (char*)(p
2dbb0 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65  Ptr += nPathname
2dbc0 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20   + 1 + nUri);.  
2dbd0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2dbe0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
2dbf0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2dc00 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  );.    if( nUri 
2dc10 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72  ) memcpy(&pPager
2dc20 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
2dc30 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20  hname+1], zUri, 
2dc40 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2dc50 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
2dc60 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2dc70 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2dc80 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2dc90 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2dca0 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30  e], "-journal\00
2dcb0 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71  0", 8+2);.    sq
2dcc0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2dcd0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2dce0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  me, pPager->zJou
2dcf0 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  rnal);.#ifndef S
2dd00 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2dd10 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20     pPager->zWal 
2dd20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  = &pPager->zJour
2dd30 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b  nal[nPathname+8+
2dd40 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2dd50 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61  Pager->zWal, zPa
2dd60 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2dd70 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2dd80 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61  pPager->zWal[nPa
2dd90 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30  thname], "-wal\0
2dda0 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73  00", 4+1);.    s
2ddb0 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2ddc0 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2ddd0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  ame, pPager->zWa
2dde0 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  l);.#endif.    s
2ddf0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2de00 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
2de10 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
2de20 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
2de30 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
2de40 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
2de50 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2de60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2de70 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2de80 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
2de90 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2deb0 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
2dec0 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
2ded0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2dee0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2def0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2df00 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
2df10 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
2df20 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d      assert( !mem
2df30 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  Db );.    readOn
2df40 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
2df50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2df60 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2df70 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
2df80 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
2df90 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2dfa0 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
2dfb0 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
2dfc0 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
2dfd0 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
2dfe0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2dff0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
2e000 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2e010 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2e020 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
2e030 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
2e040 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
2e050 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2e060 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
2e070 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
2e080 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
2e090 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
2e0a0 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
2e0b0 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
2e0c0 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
2e0d0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2e0e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e0f0 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
2e100 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2e110 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2e120 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  ->fd);.      if(
2e130 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20   !readOnly ){.  
2e140 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
2e150 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
2e160 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2e170 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2e180 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
2e190 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2e1a0 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ZE);.        if(
2e1b0 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
2e1c0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
2e1d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2e1e0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2e1f0 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2e200 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2e210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2e220 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2e230 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2e240 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
2e250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e260 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2e270 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  t = (u32)pPager-
2e280 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
2e290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e2a0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2e2b0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2e2c0 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
2e2d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
2e2e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2e2f0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2e300 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
2e310 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2e320 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2e330 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
2e340 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
2e350 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2e360 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2e370 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
2e380 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2e390 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69  ii=szPageDflt; i
2e3a0 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
2e3b0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2e3c0 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
2e3d0 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
2e3e0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2e3f0 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
2e410 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
2e420 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e440 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2e450 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2e460 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33  noLock = sqlite3
2e470 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69  _uri_boolean(zFi
2e480 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22  lename, "nolock"
2e490 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2e4a0 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
2e4b0 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d  CAP_IMMUTABLE)!=
2e4c0 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
2e4d0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2e4e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75  zFilename, "immu
2e4f0 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20  table", 0) ){.  
2e500 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73          vfsFlags
2e510 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
2e520 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
2e530 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b      goto act_lik
2e540 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20  e_temp_file;.   
2e550 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
2e560 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
2e570 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2e580 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
2e590 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
2e5a0 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
2e5b0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
2e5c0 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
2e5d0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
2e5e0 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
2e5f0 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
2e600 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
2e610 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
2e620 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
2e630 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2e640 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
2e650 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
2e660 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
2e670 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
2e680 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
2e690 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
2e6a0 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
2e6b0 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
2e6c0 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
2e6d0 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
2e6e0 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
2e6f0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  urnal..    **.  
2e700 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2e710 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66   also runs for f
2e720 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69  iles marked as i
2e730 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  mmutable..    */
2e740 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f   .act_like_temp_
2e750 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69  file:.    tempFi
2e760 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
2e770 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2e780 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f  ER_READER;     /
2e790 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72  * Pretend we alr
2e7a0 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
2e7b0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2e7c0 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56  eLock = EXCLUSIV
2e7d0 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72  E_LOCK;    /* Pr
2e7e0 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20  etend we are in 
2e7f0 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a  EXCLUSIVE mode *
2e800 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  /.    pPager->no
2e810 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20  Lock = 1;       
2e820 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2e830 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  o locking */.   
2e840 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
2e850 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2e860 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
2e870 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2e880 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
2e890 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
2e8a0 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
2e8b0 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
2e8c0 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2e8d0 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
2e8e0 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
2e8f0 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
2e900 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2e910 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2e920 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
2e930 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
2e940 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2e950 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
2e960 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
2e970 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2e980 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e990 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
2e9a0 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
2e9b0 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69  e object. */.  i
2e9c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e9d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e9e0 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
2e9f0 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e     nExtra = ROUN
2ea00 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  D8(nExtra);.    
2ea10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
2ea20 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
2ea30 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
2ea40 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2ea50 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
2ea60 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
2ea70 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
2ea80 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2ea90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
2eaa0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2eab0 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
2eac0 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72    Pager structur
2ead0 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
2eae0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2eaf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2eb00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
2eb10 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
2eb20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
2eb30 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
2eb40 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71  mpSpace);.    sq
2eb50 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
2eb60 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
2eb70 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  c;.  }..  PAGERT
2eb80 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
2eb90 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
2eba0 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
2ebb0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2ebc0 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
2ebd0 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
2ebe0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2ebf0 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
2ec00 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2ec10 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
2ec20 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  al;.  /* pPager-
2ec30 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
2ec40 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2ec50 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
2ec60 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
2ec70 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ef = 0; */.  /* 
2ec80 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
2ec90 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2eca0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
2ecb0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2ecc0 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
2ecd0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
2ece0 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
2ecf0 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
2ed00 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
2ed10 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
2ed20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2ed30 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
2ed40 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
2ed50 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
2ed60 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
2ed70 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2ed80 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
2ed90 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
2eda0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2edb0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2edc0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
2edd0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2ede0 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
2edf0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
2ee00 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
2ee10 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
2ee20 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2ee30 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
2ee40 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2ee50 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
2ee60 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
2ee70 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
2ee80 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65  readOnly;.  asse
2ee90 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
2eea0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
2eeb0 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
2eec0 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
2eed0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28  >tempFile;.  if(
2eee0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2eef0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2ef00 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d  Pager->fullSync=
2ef10 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2ef20 28 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53  ( pPager->extraS
2ef30 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ync==0 );.    as
2ef40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79  sert( pPager->sy
2ef50 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2ef60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ef70 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d  ->walSyncFlags==
2ef80 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2ef90 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2efa0 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d  cFlags==0 );.  }
2efb0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
2efc0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a  ->fullSync = 1;.
2efd0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72      pPager->extr
2efe0 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  aSync = 0;.    p
2eff0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2f000 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2f010 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
2f020 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
2f030 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2f040 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f  RMAL | WAL_SYNC_
2f050 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20  TRANSACTIONS;.  
2f060 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
2f070 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2f080 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2f090 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
2f0a0 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
2f0b0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2f0c0 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
2f0d0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
2f0e0 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
2f0f0 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
2f100 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
2f110 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
2f120 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
2f130 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
2f140 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
2f150 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2f160 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
2f170 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
2f180 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2f190 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
2f1a0 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
2f1b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2f1c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2f1d0 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
2f1e0 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
2f1f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2f200 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2f210 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
2f220 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2f230 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
2f240 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2f250 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
2f260 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
2f270 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
2f280 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
2f290 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
2f2a0 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
2f2b0 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
2f2c0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2f2d0 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
2f2e0 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
2f2f0 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20   // will be set 
2f300 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20  by btree.c */.. 
2f310 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
2f320 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
2f330 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56  ITE_OK;.}.../* V
2f340 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
2f350 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
2f360 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20   not be deleted 
2f370 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66  or renamed out f
2f380 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65  rom.** under the
2f390 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
2f3a0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2f3b0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 69   database is sti
2f3c0 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68 74  ll were it ought
2f3d0 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73  .** to be on dis
2f3e0 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  k.  Return non-z
2f3f0 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44  ero (SQLITE_READ
2f400 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20  ONLY_DBMOVED or 
2f410 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
2f420 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71  .** code from sq
2f430 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 29  lite3OsAccess())
2f440 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2f450 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e   has gone missin
2f460 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2f470 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
2f480 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
2f490 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76  ){.  int bHasMov
2f4a0 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ed = 0;.  int rc
2f4b0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
2f4c0 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75  >tempFile ) retu
2f4d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2f4e0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
2f4f0 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ze==0 ) return S
2f500 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
2f510 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  rt( pPager->zFil
2f520 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d  ename && pPager-
2f530 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b  >zFilename[0] );
2f540 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
2f550 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
2f560 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
2f570 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c  FCNTL_HAS_MOVED,
2f580 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20   &bHasMoved);.  
2f590 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
2f5a0 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f  OTFOUND ){.    /
2f5b0 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56  * If the HAS_MOV
2f5c0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
2f5d0 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64  is unimplemented
2f5e0 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
2f5f0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61  e file.    ** ha
2f600 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64  s not been moved
2f610 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20 68  .  That is the h
2f620 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69  istorical behavi
2f630 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72  or of SQLite: pr
2f640 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65  ior to.    ** ve
2f650 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20  rsion 3.8.3, it 
2f660 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f  never checked */
2f670 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2f680 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
2f690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f6a0 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20  & bHasMoved ){. 
2f6b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
2f6c0 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b  EADONLY_DBMOVED;
2f6d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2f6e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
2f6f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2f700 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
2f710 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
2f720 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
2f730 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
2f740 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
2f750 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2f760 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
2f770 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
2f780 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
2f790 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
2f7a0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
2f7b0 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
2f7c0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
2f7d0 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
2f7e0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
2f7f0 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
2f800 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
2f810 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2f820 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
2f830 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
2f840 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
2f850 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
2f860 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
2f870 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2f880 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2f890 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2f8a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2f8b0 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
2f8c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
2f8d0 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
2f8e0 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
2f8f0 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
2f900 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
2f910 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2f920 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
2f930 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
2f940 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
2f950 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2f960 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
2f970 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
2f980 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
2f990 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
2f9a0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
2f9b0 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
2f9c0 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
2f9d0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2f9e0 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
2f9f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2fa00 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
2fa10 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
2fa20 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
2fa30 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2fa40 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2fa50 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2fa60 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2fa70 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
2fa80 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
2fa90 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2faa0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2fab0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2fac0 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
2fad0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2fae0 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
2faf0 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
2fb00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2fb10 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
2fb20 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
2fb30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
2fb40 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
2fb50 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
2fb60 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
2fb70 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
2fb80 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
2fb90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2fba0 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2fbb0 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
2fbc0 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
2fbd0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
2fbe0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2fbf0 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
2fc00 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2fc10 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
2fc20 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2fc30 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
2fc40 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2fc50 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
2fc60 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
2fc70 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2fc80 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2fc90 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2fca0 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
2fcb0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2fcc0 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
2fcd0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2fce0 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
2fcf0 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
2fd00 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2fd10 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
2fd20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
2fd30 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
2fd40 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2fd50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
2fd60 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
2fd70 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2fd80 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
2fd90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2fda0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2fdb0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2fdc0 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
2fdd0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2fde0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
2fdf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2fe00 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
2fe10 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
2fe20 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2fe30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
2fe40 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2fe50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2fe60 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2fe70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2fe80 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2fe90 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
2fea0 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
2feb0 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
2fec0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2fed0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
2fee0 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
2fef0 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
2ff00 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
2ff10 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
2ff20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
2ff30 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
2ff40 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
2ff50 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2ff60 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2ff70 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
2ff80 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
2ff90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ffa0 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
2ffb0 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
2ffc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ffd0 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
2ffe0 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2fff0 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
30000 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
30010 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
30020 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
30030 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
30040 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
30050 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
30060 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
30070 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
30080 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
30090 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
300a0 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
300b0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
300c0 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
300d0 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
300e0 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
300f0 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
30100 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
30110 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
30120 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
30130 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
30140 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
30150 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
30160 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
30170 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
30180 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
30190 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
301a0 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
301b0 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
301c0 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
301d0 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
301e0 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
301f0 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
30200 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
30210 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
30220 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
30230 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
30240 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
30250 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
30260 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
30270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30280 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
30290 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
302a0 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
302b0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
302c0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
302d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
302e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
302f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
30300 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20 70 61  abase is zero pa
30310 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 61  ges in size, tha
30320 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74  t means that eit
30330 68 65 72 20 28 31 29 20 74 68 65 0a 20 20 20 20  her (1) the.    
30340 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
30350 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d  s a remnant from
30360 20 61 20 70 72 69 6f 72 20 64 61 74 61 62 61 73   a prior databas
30370 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
30380 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20 20 20  name where.     
30390 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
303a0 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f 74 20  se file but not 
303b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
303c0 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32 29 20  deleted, or (2) 
303d0 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20 20 20  the initial.    
303e0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
303f0 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65  on that populate
30400 73 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  s a new database
30410 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
30420 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
30430 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
30440 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
30450 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  le can be delete
30460 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 61 6b  d.  However, tak
30470 65 20 63 61 72 65 0a 20 20 20 20 20 20 20 20 2a  e care.        *
30480 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65 20  * not to delete 
30490 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
304a0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
304b0 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20 20  y open due to.  
304c0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
304d0 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a 20  _mode=PERSIST.. 
304e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
304f0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26    if( nPage==0 &
30500 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  & !jrnlOpen ){. 
30510 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30520 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
30530 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  c();.          i
30540 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70  f( pagerLockDb(p
30550 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
30560 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)==SQLITE_OK
30570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30580 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
30590 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
305a0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
305b0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
305c0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
305d0 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b  de ) pagerUnlock
305e0 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
305f0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
30600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
30610 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
30620 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
30630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30640 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
30650 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
30660 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
30670 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72  tion has a reser
30680 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ved.          **
30690 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
306a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
306b0 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b   file. Now check
306c0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20   that there is. 
306d0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c           ** at l
306e0 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72  east one non-zer
306f0 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73  o bytes at the s
30700 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
30710 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
30720 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
30730 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73  is, then we cons
30740 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61  ider this journa
30750 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20  l to be hot. If 
30760 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  not, .          
30770 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e  ** it can be ign
30780 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  ored..          
30790 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
307a0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
307b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
307c0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
307d0 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
307e0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
307f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30800 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
30810 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
30820 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
30830 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20  jfd, f, &f);.   
30840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30850 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30870 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
30880 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
30890 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
308a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
308b0 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
308c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
308d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
308e0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
308f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30900 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
30920 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30930 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
30940 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30950 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
30960 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
30970 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30980 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
30990 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
309a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
309b0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
309c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
309d0 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
309e0 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
309f0 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
30a00 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
30a10 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
30a20 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f 20 68   it has a zero h
30a30 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68  eader, that migh
30a40 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49  t be due to an I
30a50 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20  /O error, or.   
30a60 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d           ** it m
30a70 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74  ight be due to t
30a80 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  he race conditio
30a90 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  n described abov
30aa0 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20  e and in.       
30ab0 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23       ** ticket #
30ac0 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61  3883.  Either wa
30ad0 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  y, assume that t
30ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
30af0 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
30b00 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20  * This might be 
30b10 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
30b20 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c  .  But if it is,
30b30 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
30b40 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74        ** automat
30b50 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62  ic journal playb
30b60 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79  ack and recovery
30b70 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20   mechanism will 
30b80 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20  deal.           
30b90 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65   ** with it unde
30ba0 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
30bb0 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20  ock where we do 
30bc0 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  not need to.    
30bd0 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79          ** worry
30be0 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61   so much with ra
30bf0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20  ce conditions.. 
30c00 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
30c10 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
30c20 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ts = 1;.        
30c30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30c40 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
30c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30c60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
30c70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
30c80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
30c90 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
30ca0 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
30cb0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
30cc0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
30cd0 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
30ce0 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  l sqlite3PagerGe
30cf0 74 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20  t() until after 
30d00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
30d10 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
30d20 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49  sfully called. I
30d30 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  f a shared-lock 
30d40 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  is already held 
30d50 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  when.** this fun
30d60 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
30d70 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
30d80 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
30d90 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ing operations a
30da0 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65  re also performe
30db0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
30dc0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  on..**.**   1) I
30dd0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
30de0 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45  urrently in PAGE
30df0 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f  R_OPEN state (no
30e00 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20   lock held.**   
30e10 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
30e20 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61  se file), then a
30e30 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
30e40 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a  e to obtain a.**
30e50 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63        SHARED loc
30e60 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
30e70 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74  e file. Immediat
30e80 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
30e90 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
30ea0 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
30eb0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
30ec0 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f  checked for a ho
30ed0 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20  t-journal,.**   
30ee0 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79     which is play
30ef0 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65  ed back if prese
30f00 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e  nt. Following an
30f10 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a  y hot-journal .*
30f20 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c  *      rollback,
30f30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
30f40 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76   the cache are v
30f50 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63  alidated by chec
30f60 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  king.**      the
30f70 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72   'change-counter
30f80 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64  ' field of the d
30f90 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
30fa0 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  der and.**      
30fb0 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65  discarded if the
30fc0 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62  y are found to b
30fd0 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  e invalid..**.**
30fe0 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67     2) If the pag
30ff0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
31000 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c   exclusive-mode,
31010 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63   and there are c
31020 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
31030 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
31040 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e  references to an
31050 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20  y pages, and is 
31060 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
31070 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e  te,.**      then
31080 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
31090 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65  ade to clear the
310a0 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20   error state by 
310b0 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20  discarding.**   
310c0 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20     the contents 
310d0 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
310e0 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61  e and rolling ba
310f0 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72  ck any open jour
31100 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  nal.**      file
31110 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
31120 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
31130 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
31140 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
31150 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
31160 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b  ccurs while lock
31170 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
31180 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61  , checking for a
31190 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
311a0 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67  e or .** rolling
311b0 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
311c0 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72  file, the IO err
311d0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
311e0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
311f0 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
31200 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
31210 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
31220 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
31230 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
31240 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
31250 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
31260 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
31270 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79   b-tree and only
31280 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
31290 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64  no.  ** outstand
312a0 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20  ing pages. This 
312b0 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
312c0 20 70 61 67 65 72 20 73 74 61 74 65 20 73 68 6f   pager state sho
312d0 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20  uld either.  ** 
312e0 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45  be OPEN or READE
312f0 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c  R. READER is onl
31300 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68  y possible if th
31310 65 20 70 61 67 65 72 20 69 73 20 6f 72 20 77 61  e pager is or wa
31320 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75  s in .  ** exclu
31330 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
31340 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
31350 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
31360 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
31370 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61  Cache)==0 );.  a
31380 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
31390 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
313a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
313b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
313c0 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61  AGER_OPEN || pPa
313d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
313e0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
313f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31400 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
31410 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  K );..  if( !pag
31420 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
31430 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
31440 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
31450 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f  {.    int bHotJo
31460 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20  urnal = 1;      
31470 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
31480 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f  here exists a ho
31490 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a  t journal-file *
314a0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
314b0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
314c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
314d0 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
314e0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
314f0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
31500 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
31510 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
31520 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
31530 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31540 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
31550 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31560 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
31570 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
31580 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
31590 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
315a0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
315b0 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
315c0 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
315d0 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
315e0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
315f0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
31600 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
31610 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
31620 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
31630 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
31640 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
31650 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
31660 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
31670 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
31680 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72  Pager, &bHotJour
31690 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nal);.    }.    
316a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
316b0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
316c0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
316d0 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61    if( bHotJourna
316e0 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l ){.      if( p
316f0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
31700 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
31710 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
31720 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
31730 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
31740 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
31750 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
31760 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
31770 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
31780 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
31790 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
317a0 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
317b0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
317c0 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
317d0 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
317e0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
317f0 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
31800 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
31810 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
31820 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
31830 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
31840 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
31850 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
31860 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
31870 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
31880 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
31890 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
318a0 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
318b0 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
318c0 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
318d0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
318e0 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
318f0 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
31900 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
31910 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
31920 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
31930 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
31940 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
31950 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
31960 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
31970 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
31980 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
31990 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
319a0 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
319b0 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
319c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
319d0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
319e0 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   ** Unless the p
319f0 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69  ager is in locki
31a00 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
31a10 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  e mode, the lock
31a20 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77   is.      ** dow
31a30 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45  ngraded to SHARE
31a40 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68  D_LOCK before th
31a50 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
31a60 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rns..      */.  
31a70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
31a80 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
31a90 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
31aa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31ac0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
31ad0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
31ae0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
31af0 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74  ready open and t
31b00 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f  he file exists o
31b10 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65  n disk, open the
31b20 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
31b30 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
31b40 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20  e access. Write 
31b50 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72  access is requir
31b60 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20  ed because .    
31b70 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76    ** in exclusiv
31b80 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
31b90 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
31ba0 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
31bb0 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  pen .      ** an
31bc0 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  d possibly used 
31bd0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
31be0 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f  n later on. Also
31bf0 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a  , write-access .
31c00 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61        ** is usua
31c10 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  lly required to 
31c20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
31c30 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  rnal in journal_
31c40 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20  mode=persist .  
31c50 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64      ** mode (and
31c60 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61   also for journa
31c70 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20  l_mode=truncate 
31c80 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29  on some systems)
31c90 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
31ca0 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   ** If the journ
31cb0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
31cc0 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
31cd0 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
31ce0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f       ** other co
31cf0 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64  nnection managed
31d00 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72   to get in and r
31d10 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f  oll it back befo
31d20 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  re .      ** thi
31d30 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
31d40 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
31d50 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
31d60 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  Or, it .      **
31d70 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74   may mean that t
31d80 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
31d90 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
31da0 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20  when this.      
31db0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
31dc0 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a  called and the j
31dd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
31de0 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
31df0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
31e00 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
31e10 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fd) ){.        s
31e20 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
31e30 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
31e40 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20  ->pVfs;.        
31e50 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20  int bExists;    
31e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
31e70 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
31e80 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
31e90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31ea0 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
31eb0 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
31ec0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
31ed0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
31ee0 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20  TS, &bExists);. 
31ef0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
31f00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69  QLITE_OK && bExi
31f10 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sts ){.         
31f20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
31f30 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
31f40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
31f50 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
31f60 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
31f70 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31f80 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
31f90 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
31fa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31fb0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
31fc0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
31fd0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
31fe0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ut);.          a
31ff0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
32000 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
32010 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
32020 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
32030 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
32040 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
32050 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
32060 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32070 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
32080 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
32090 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
320a0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
320b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
320c0 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
320d0 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
320e0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
320f0 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
32100 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
32110 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
32120 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
32130 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74  ad lock. Purge t
32140 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a  he cache before.
32150 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67        ** playing
32160 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f   back the hot-jo
32170 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65  urnal so that we
32180 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69   don't end up wi
32190 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  th.      ** an i
321a0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68  nconsistent cach
321b0 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74  e.  Sync the hot
321c0 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
321d0 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a  playing.      **
321e0 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74   it back since t
321f0 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
32200 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74  crashed and left
32210 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
32220 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  .      ** probab
32230 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20  ly did not sync 
32240 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65  it and we are re
32250 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73  quired to always
32260 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74   sync.      ** t
32270 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
32280 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63  e playing it bac
32290 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
322a0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
322b0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
322c0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
322d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
322e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
322f0 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
32300 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
32310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32320 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
32330 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
32340 63 6b 28 70 50 61 67 65 72 2c 20 21 70 50 61 67  ck(pPager, !pPag
32350 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
32360 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
32370 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
32380 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OPEN;.        }.
32390 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
323a0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
323b0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
323c0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28    pagerUnlockDb(
323d0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
323e0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OCK);.      }.. 
323f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32400 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32410 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
32420 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20   is taken if an 
32430 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
32440 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  le trying to ope
32450 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  n.        ** or 
32460 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d  roll back a hot-
32470 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f  journal while ho
32480 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
32490 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
324a0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e       ** pager_un
324b0 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77  lock() routine w
324c0 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ill be called be
324d0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74  fore returning t
324e0 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20  o unlock.       
324f0 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66   ** the file. If
32500 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65   the unlock atte
32510 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  mpt fails, then 
32520 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74  Pager.eLock must
32530 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   be.        ** s
32540 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
32550 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d  CK (see the comm
32560 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
32570 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20  efine for .     
32580 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f     ** UNKNOWN_LO
32590 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20  CK above for an 
325a0 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20  explanation). . 
325b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
325c0 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f    ** In order to
325d0 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63   get pager_unloc
325e0 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20  k() to do this, 
325f0 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65  set Pager.eState
32600 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50   to.        ** P
32610 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20  AGER_ERROR now. 
32620 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
32630 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20  ally counted as 
32640 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20  a transition.   
32650 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52       ** to ERROR
32660 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74   state in the st
32670 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74  ate diagram at t
32680 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
32690 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile,.        ** 
326a0 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
326b0 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c  at the same call
326c0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
326d0 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20  () will very.   
326e0 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20       ** shortly 
326f0 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70  transition the p
32700 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  ager object to t
32710 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43  he OPEN state. C
32720 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  alling.        *
32730 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  * assert_pager_s
32740 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69  tate() would fai
32750 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f  l now, as it sho
32760 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  uld not be possi
32770 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ble.        ** t
32780 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74  o be in ERROR st
32790 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61  ate when there a
327a0 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64  re zero outstand
327b0 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20  ing page .      
327c0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e    ** references.
327d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
327e0 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
327f0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
32800 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
32810 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
32820 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32830 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
32840 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  PEN );.      ass
32850 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
32860 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
32870 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
32880 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
32890 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
328a0 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ->eLock>SHARED_L
328b0 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  OCK).      );.  
328c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
328d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
328e0 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c  & pPager->hasHel
328f0 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20  dSharedLock ){. 
32900 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
32910 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
32920 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 74   been acquired t
32930 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20 20  hen check to.   
32940 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68 65     ** see if the
32950 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
32960 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
32970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
32980 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20 20 20  s changed,.     
32990 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63 61   ** flush the ca
329a0 63 68 65 2e 20 20 54 68 65 20 68 61 73 48 65 6c  che.  The hasHel
329b0 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67  dSharedLock flag
329c0 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 66   prevents this f
329d0 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  rom.      ** occ
329e0 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76 65  urring on the ve
329f0 72 79 20 66 69 72 73 74 20 61 63 63 65 73 73 20  ry first access 
32a00 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72  to a file, in or
32a10 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20 20  der to save a.  
32a20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e      ** single un
32a30 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69 74 65  necessary sqlite
32a40 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20 61  3OsRead() call a
32a50 74 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e 0a  t the start-up..
32a60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
32a70 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
32a80 65 73 20 61 72 65 20 64 65 74 65 63 74 65 64 20  es are detected 
32a90 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
32aa0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
32ab0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
32ac0 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
32ad0 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
32ae0 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
32af0 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
32b00 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
32b10 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
32b20 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
32b30 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
32b40 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
32b50 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
32b60 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
32b70 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
32b80 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
32b90 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
32ba0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
32bb0 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
32bc0 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
32bd0 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
32be0 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
32bf0 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
32c00 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
32c10 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
32c20 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
32c30 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
32c40 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
32c50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
32c60 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b   Pgno nPage = 0;
32c70 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
32c80 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
32c90 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
32ca0 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  )];..      rc = 
32cb0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
32cc0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
32cd0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
32ce0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20  oto failed;..   
32cf0 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
32d00 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
32d10 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
32d20 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
32d30 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
32d40 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
32d50 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
32d60 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
32d70 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
32d80 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
32d90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32da0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
32db0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
32dc0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
32dd0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
32de0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
32df0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32e00 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
32e10 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
32e20 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
32e30 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
32e40 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
32e50 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
32e60 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
32e70 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
32e80 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
32e90 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  eset(pPager);.. 
32ea0 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20         /* Unmap 
32eb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32ec0 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  e. It is possibl
32ed0 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20  e that external 
32ee0 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20  processes.      
32ef0 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72    ** may have tr
32f00 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61  uncated the data
32f10 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
32f20 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62  en extended it b
32f30 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ack.        ** t
32f40 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
32f50 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70  ize while this p
32f60 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68  rocess was not h
32f70 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20  olding a lock.. 
32f80 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
32f90 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79  s case there may
32fa0 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70   exist a Pager.p
32fb0 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74  Map mapping that
32fc0 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20   appears.       
32fd0 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69   ** to be the ri
32fe0 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20  ght size but is 
32ff0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c  not actually val
33000 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20  id. Avoid this. 
33010 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
33020 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69  ility by unmappi
33030 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20  ng the db here. 
33040 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55  */.        if( U
33050 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
33060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
33070 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
33080 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
33090 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
330a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
330b0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57   If there is a W
330c0 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  AL file in the f
330d0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e  ile-system, open
330e0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
330f0 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64  n WAL.    ** mod
33100 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  e. Otherwise, th
33110 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
33120 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e  tion call is a n
33130 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
33140 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57   rc = pagerOpenW
33150 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67  alIfPresent(pPag
33160 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  er);.#ifndef SQL
33170 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
33180 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33190 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d  >pWal==0 || rc==
331a0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e  SQLITE_OK );.#en
331b0 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
331c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
331d0 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
331e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
331f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
33200 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
33210 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
33220 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
33230 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26  ->tempFile==0 &&
33240 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33250 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72  =PAGER_OPEN && r
33260 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
33270 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
33280 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
33290 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  &pPager->dbSize)
332a0 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
332b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
332c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
332d0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
332e0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
332f0 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
33300 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33310 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
33320 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
33330 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
33340 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20  AGER_READER;.   
33350 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
33360 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a  SharedLock = 1;.
33370 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
33380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
33390 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
333a0 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
333b0 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
333c0 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
333d0 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
333e0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
333f0 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
33400 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
33410 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
33420 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
33430 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
33440 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
33450 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
33460 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
33470 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
33480 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
33490 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
334a0 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
334b0 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
334c0 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
334d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
334e0 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
334f0 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33 50  ==0 && (sqlite3P
33500 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
33510 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
33520 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  0) ){.    pagerU
33530 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
33540 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
33550 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
33560 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
33570 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  ge number pgno i
33580 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28  n pager pPager (
33590 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65  a page.** refere
335a0 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50  nce has type DbP
335b0 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65  age*). If the re
335c0 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
335d0 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
335e0 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
335f0 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
33600 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
33610 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
33620 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
33630 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
33640 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
33650 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
33660 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
33670 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
33680 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
33690 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
336a0 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
336b0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
336c0 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
336d0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
336e0 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
336f0 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
33700 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
33710 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
33720 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
33730 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
33740 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
33750 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
33760 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
33770 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
33780 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
33790 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
337a0 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
337b0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
337c0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
337d0 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
337e0 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
337f0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
33800 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
33810 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33820 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
33830 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
33840 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
33850 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
33860 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
33870 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
33880 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
33890 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
338a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
338b0 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  age or if a .** 
338c0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
338d0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
338e0 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65  noContent parame
338f0 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ter and the .** 
33900 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
33910 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
33920 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
33930 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
33940 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
33950 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
33960 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
33970 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
33980 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
33990 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
339a0 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  s. .**.** If noC
339b0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
339c0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
339d0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
339e0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
339f0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ** of the page. 
33a00 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
33a10 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  wo scenarios:.**
33a20 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65  .**   a) When re
33a30 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73  ading a free-lis
33a40 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d  t leaf page from
33a50 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61   the database, a
33a60 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68  nd.**.**   b) Wh
33a70 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69  en a savepoint i
33a80 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
33a90 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20  ack and we need 
33aa0 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20  to load.**      
33ab0 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20  a new page into 
33ac0 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20  the cache to be 
33ad0 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
33ae0 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20  data read.**    
33af0 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70    from the savep
33b00 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  oint journal..**
33b10 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
33b20 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
33b30 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  he data returned
33b40 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65   is zeroed inste
33b50 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72  ad of.** being r
33b60 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
33b70 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
33b80 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f  lly, the bits co
33b90 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
33ba0 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e  o pgno in Pager.
33bb0 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76  pInJournal (bitv
33bc0 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
33bd0 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
33be0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
33bf0 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65  le) and the Page
33c00 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
33c10 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20  vepoint bitvecs 
33c20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73  of any open.** s
33c30 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65  avepoints are se
33c40 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  t. This means if
33c50 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64   the page is mad
33c60 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e  e writable at an
33c70 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68  y.** point in th
33c80 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20  e future, using 
33c90 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
33ca0 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69  3PagerWrite(), i
33cb0 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77  ts contents.** w
33cc0 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e  ill not be journ
33cd0 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73  aled. This saves
33ce0 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61   IO..**.** The a
33cf0 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
33d00 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
33d10 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
33d20 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
33d30 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
33d40 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
33d50 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
33d60 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
33d70 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
33d80 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
33d90 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
33da0 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
33db0 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
33dc0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
33dd0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
33de0 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
33df0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
33e00 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
33e10 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
33e20 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
33e30 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
33e40 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
33e50 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
33e60 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
33e70 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
33e80 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
33e90 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
33ea0 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
33eb0 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
33ec0 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
33ed0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
33ee0 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
33ef0 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
33f00 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
33f10 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
33f20 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
33f30 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
33f40 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
33f50 47 65 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Get(.  Pager *pP
33f60 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
33f70 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
33f80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33f90 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
33fa0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
33fb0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
33fc0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
33fd0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
33fe0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
33ff0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
34000 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
34010 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
34020 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
34030 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
34040 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
34050 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
34060 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20  u32 iFrame = 0; 
34070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34080 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64  /* Frame to read
34090 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a   from WAL file *
340a0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f  /.  const int no
340b0 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73  Content = (flags
340c0 20 26 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43   & PAGER_GET_NOC
340d0 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49  ONTENT);..  /* I
340e0 74 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 20  t is acceptable 
340f0 74 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e  to use a read-on
34100 6c 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66  ly (mmap) page f
34110 6f 72 20 61 6e 79 20 70 61 67 65 20 65 78 63 65  or any page exce
34120 70 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69  pt.  ** page 1 i
34130 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72  f there is no wr
34140 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
34150 6f 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55  open or the ACQU
34160 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a  IRE_READONLY.  *
34170 2a 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69  * flag was speci
34180 66 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  fied by the call
34190 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20  er. And so long 
341a0 61 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74  as the db is not
341b0 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61   a .  ** tempora
341c0 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  ry or in-memory 
341d0 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
341e0 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f  const int bMmapO
341f0 6b 20 3d 20 28 70 67 6e 6f 3e 31 20 26 26 20 55  k = (pgno>1 && U
34200 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 0a  SEFETCH(pPager).
34210 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
34220 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
34230 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DER || (flags & 
34240 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
34250 4c 59 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49  LY)).#ifdef SQLI
34260 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
34270 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  && pPager->xCode
34280 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 3b  c==0.#endif.  );
34290 0a 0a 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74  ..  /* Optimizat
342a0 69 6f 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e  ion note:  Addin
342b0 67 20 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20  g the "pgno<=1" 
342c0 74 65 72 6d 20 62 65 66 6f 72 65 20 22 70 67 6e  term before "pgn
342d0 6f 3d 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a 20  o==0" here.  ** 
342e0 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70 69  allows the compi
342f0 6c 65 72 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f  ler optimizer to
34300 20 72 65 75 73 65 20 74 68 65 20 72 65 73 75 6c   reuse the resul
34310 74 73 20 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e  ts of the "pgno>
34320 31 22 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e 20  1".  ** test in 
34330 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 74 61  the previous sta
34340 74 65 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69  tement, and avoi
34350 64 20 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d  d testing pgno==
34360 30 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f  0 in the.  ** co
34370 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
34380 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a  pgno is large. *
34390 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20  /.  if( pgno<=1 
343a0 26 26 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  && pgno==0 ){.  
343b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
343c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
343d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
343e0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
343f0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
34400 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
34410 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
34420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 6f   );.  assert( no
34430 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d  Content==0 || bM
34440 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20 20 61  mapOk==0 );..  a
34450 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68  ssert( pPager->h
34460 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
34470 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==1 );..  /* If 
34480 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
34490 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
344a0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
344b0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20   immediately. . 
344c0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72   ** Otherwise, r
344d0 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20  equest the page 
344e0 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20  from the PCache 
344f0 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20  layer. */.  if( 
34500 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
34510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34520 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
34530 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  rrCode;.  }else{
34540 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  .    if( bMmapOk
34550 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
34560 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
34570 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
34580 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
34590 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
345a0 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
345b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
345c0 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
345d0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
345e0 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  .    if( bMmapOk
345f0 20 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b   && iFrame==0 ){
34600 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
34610 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72  ta = 0;..      r
34620 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74  c = sqlite3OsFet
34630 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a  ch(pPager->fd, .
34640 20 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28            (i64)(
34650 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72  pgno-1) * pPager
34660 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67  ->pageSize, pPag
34670 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70  er->pageSize, &p
34680 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20  Data.      );.. 
34690 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
346a0 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20  ITE_OK && pData 
346b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
346c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
346d0 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20  GER_READER ){.  
346e0 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73 71          pPg = sq
346f0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
34700 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
34710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34720 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
34730 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
34740 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
34750 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  ge(pPager, pgno,
34760 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20   pData, &pPg);. 
34770 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
34780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
34790 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
347a0 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d  >fd, (i64)(pgno-
347b0 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  1)*pPager->pageS
347c0 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
347d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
347e0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
347f0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
34800 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
34810 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
34820 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20   pPg;.          
34830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34840 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34850 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
34860 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34870 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
34880 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34890 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
348a0 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65    {.      sqlite
348b0 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70  3_pcache_page *p
348c0 42 61 73 65 3b 0a 20 20 20 20 20 20 70 42 61 73  Base;.      pBas
348d0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
348e0 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
348f0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29  PCache, pgno, 3)
34900 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 61 73  ;.      if( pBas
34910 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
34920 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
34930 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70 50  heFetchStress(pP
34940 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
34950 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20 20  gno, &pBase);.  
34960 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34970 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
34980 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34990 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
349a0 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ase==0 ){.      
349b0 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67      pPg = *ppPag
349c0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
349d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
349e0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
349f0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34a00 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34a10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34a20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
34a30 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
34a40 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67  FetchFinish(pPag
34a50 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34a60 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20 20 20 20  o, pBase);.     
34a70 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20   assert( pPg!=0 
34a80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
34a90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34aa0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  K ){.    /* Eith
34ab0 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
34ac0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34ad0 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20  h() returned an 
34ae0 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20  error or the.   
34af0 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c   ** pager was al
34b00 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
34b10 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
34b20 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
34b30 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53  called..    ** S
34b40 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20  et pPg to 0 and 
34b50 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65  jump to the exce
34b60 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20  ption handler.  
34b70 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  */.    pPg = 0;.
34b80 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
34b90 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a  cquire_err;.  }.
34ba0 20 20 61 73 73 65 72 74 28 20 70 50 67 3d 3d 28    assert( pPg==(
34bb0 2a 70 70 50 61 67 65 29 20 29 3b 0a 20 20 61 73  *ppPage) );.  as
34bc0 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d  sert( pPg->pgno=
34bd0 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
34be0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
34bf0 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70  pPager || pPg->p
34c00 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69  Pager==0 );..  i
34c10 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72 20 26  f( pPg->pPager &
34c20 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  & !noContent ){.
34c30 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
34c40 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61  ase the pcache a
34c50 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
34c60 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63  an initialized c
34c70 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  opy of.    ** th
34c80 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77  e page. Return w
34c90 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61  ithout further a
34ca0 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  do.  */.    asse
34cb0 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f  rt( pgno<=PAGER_
34cc0 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f  MAX_PGNO && pgno
34cd0 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
34ce0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70  pPager) );.    p
34cf0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
34d00 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a  ER_STAT_HIT]++;.
34d10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34d20 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a  E_OK;..  }else{.
34d30 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
34d40 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
34d50 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
34d60 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
34d70 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
34d80 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
34d90 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
34da0 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20   = pPager;..    
34db0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
34dc0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
34dd0 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
34de0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
34df0 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  age.    ** numbe
34e00 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
34e10 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73  his, or the unus
34e20 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c  ed locking-page,
34e30 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a   is requested. *
34e40 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50  /.    if( pgno>P
34e50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
34e60 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
34e70 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
34e80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34e90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
34ea0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
34eb0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34ec0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d    }..    if( MEM
34ed0 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  DB || pPager->db
34ee0 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43  Size<pgno || noC
34ef0 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65  ontent || !isOpe
34f00 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
34f10 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
34f20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
34f30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
34f40 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
34f50 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
34f60 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34f70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f    }.      if( no
34f80 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
34f90 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
34fa0 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e   set the bits in
34fb0 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62   the InJournal b
34fc0 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65  it-vectors is be
34fd0 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  nign..        **
34fe0 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73   It merely means
34ff0 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64   that we might d
35000 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72  o some extra wor
35010 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a  k to journal a .
35020 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
35030 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
35040 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
35050 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ed.  Nevertheles
35060 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20  s, be sure .    
35070 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
35080 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20  he case where a 
35090 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
350a0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
350b0 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20   to set .       
350c0 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62   ** a bit in a b
350d0 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20  it vector..     
350e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
350f0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
35100 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
35110 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
35120 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
35130 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
35140 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
35150 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
35160 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35170 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
35180 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
35190 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
351a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
351b0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
351c0 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
351d0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
351e0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
351f0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
35200 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
35210 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
35220 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
35230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
35240 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
35250 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
35260 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f  eSize);.      IO
35270 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
35280 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
35290 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
352a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65  {.      if( page
352b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
352c0 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b  && bMmapOk==0 ){
352d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
352e0 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
352f0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
35300 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
35310 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
35320 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
35330 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
35340 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
35350 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
35360 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
35370 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
35380 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
35390 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72  MISS]++;.      r
353a0 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
353b0 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20  Pg, iFrame);.   
353c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
353d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
353e0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
353f0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
35400 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
35410 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
35420 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
35430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
35440 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a  er_acquire_err:.
35450 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
35460 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
35470 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69   pPg ){.    sqli
35480 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
35490 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
354a0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
354b0 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67  ager);..  *ppPag
354c0 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
354d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
354e0 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
354f0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
35500 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
35510 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
35520 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
35530 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
35540 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
35550 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
35560 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
35570 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a  ot in cache. .**
35580 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
35590 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
355a0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
355b0 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
355c0 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
355d0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
355e0 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
355f0 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
35600 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
35610 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
35620 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
35630 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
35640 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
35650 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
35660 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
35670 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
35680 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
35690 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
356a0 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
356b0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
356c0 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
356d0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
356e0 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
356f0 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  page *pPage;.  a
35700 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
35710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
35720 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no!=0 );.  asser
35730 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  t( pPager->pPCac
35740 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  he!=0 );.  pPage
35750 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
35760 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
35770 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b  Cache, pgno, 0);
35780 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35790 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68  ==0 || pPager->h
357a0 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
357b0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d   );.  if( pPage=
357c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
357d0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
357e0 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68  cacheFetchFinish
357f0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
35800 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a  , pgno, pPage);.
35810 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
35820 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
35830 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
35840 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
35850 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
35860 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
35870 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
35880 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
35890 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
358a0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
358b0 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
358c0 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
358d0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
358e0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
358f0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
35900 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f  * removed..*/.vo
35910 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
35920 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61  nrefNotNull(DbPa
35930 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
35940 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73  r *pPager;.  ass
35950 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20  ert( pPg!=0 );. 
35960 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
35970 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67  Pager;.  if( pPg
35980 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
35990 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70 61 67 65  MMAP ){.    page
359a0 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
359b0 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pPg);.  }else{. 
359c0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
359d0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
359e0 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
359f0 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
35a00 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
35a10 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
35a20 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
35a30 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  g ) sqlite3Pager
35a40 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67  UnrefNotNull(pPg
35a50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
35a60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
35a70 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
35a80 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
35a90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
35aa0 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
35ab0 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
35ac0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
35ad0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
35ae0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
35af0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
35b00 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
35b10 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
35b20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
35b30 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
35b40 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
35b50 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
35b60 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
35b70 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
35b80 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
35b90 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
35ba0 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
35bb0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
35bc0 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
35bd0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
35be0 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
35bf0 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
35c00 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
35c10 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
35c20 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
35c30 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
35c40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
35c50 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
35c60 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
35c70 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
35c80 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
35c90 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
35ca0 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
35cb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
35cc0 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
35cd0 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
35ce0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
35cf0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
35d00 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
35d10 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
35d20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
35d30 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
35d40 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
35d50 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
35d60 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
35d70 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
35d80 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
35d90 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
35da0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
35db0 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
35dc0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
35dd0 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
35de0 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
35df0 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
35e00 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
35e10 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
35e20 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
35e30 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
35e40 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
35e50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
35e60 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
35e70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
35e80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
35e90 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
35ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35eb0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
35ec0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
35ed0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
35ee0 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
35ef0 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
35f00 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
35f10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35f20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
35f30 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
35f40 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
35f50 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
35f60 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
35f70 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
35f80 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
35f90 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
35fa0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
35fb0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
35fc0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
35fd0 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68   on.  ** the oth
35fe0 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f  er hand, this ro
35ff0 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
36000 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20  alled if we are 
36010 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20  already in.  ** 
36020 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  an error state. 
36030 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
36040 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
36050 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
36060 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
36070 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
36080 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
36090 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
360a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
360b0 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OFF ){.    pPage
360c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
360d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
360e0 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
360f0 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
36100 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
36110 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
36120 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
36130 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  BKPT;.    }.  . 
36140 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
36150 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
36160 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
36170 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   open. */.    if
36180 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
36190 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
361a0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
361b0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
361c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
361d0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y ){.        sql
361e0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
361f0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
36200 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
36210 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
36220 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
36230 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
36240 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
36250 20 20 20 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a      int nSpill;.
36260 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
36270 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
36280 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
36290 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e   |= (SQLITE_OPEN
362a0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
362b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
362c0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
362d0 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c      nSpill = sql
362e0 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74  ite3Config.nStmt
362f0 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  Spill;.        }
36300 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
36310 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
36320 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
36330 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70  L;.          nSp
36340 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72  ill = jrnlBuffer
36350 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
36360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36370 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65    .        /* Ve
36380 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61  rify that the da
36390 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73  tabase still has
363a0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
363b0 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20  s it did when.  
363c0 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20        ** it was 
363d0 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
363e0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  d. */.        rc
363f0 20 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d   = databaseIsUnm
36400 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  oved(pPager);.  
36410 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36430 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36440 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20  3JournalOpen (. 
36450 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66               pVf
36460 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
36470 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
36480 2c 20 66 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a  , flags, nSpill.
36490 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
364a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
364b0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
364c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
364d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
364e0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ) );.    }.  .  
364f0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
36500 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
36510 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f  header to the jo
36520 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f  urnal file and o
36530 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  pen .    ** the 
36540 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
36550 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
36560 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
36570 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36580 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
36590 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
365a0 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
365b0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61  ed. */.      pPa
365c0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
365d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
365e0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
365f0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
36600 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
36610 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
36620 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  dr = 0;.      rc
36630 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
36640 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
36650 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
36660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36670 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
36680 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
36690 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
366a0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
366b0 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  al = 0;.  }else{
366c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
366d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
366e0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
366f0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
36700 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
36710 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a  RITER_CACHEMOD;.
36720 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
36730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
36740 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
36750 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63  tion on the spec
36760 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65  ified pager obje
36770 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69  ct. If a .** wri
36780 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
36790 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
367a0 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  opened, this fun
367b0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
367c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
367d0 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  xFlag argument i
367e0 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63  s false, then ac
367f0 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61  quire at least a
36800 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
36810 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
36820 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61  e file. If exFla
36830 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
36840 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
36850 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45  .** an EXCLUSIVE
36860 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61   lock. If such a
36870 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
36880 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e   held, no lockin
36890 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  g .** functions 
368a0 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a  need be called..
368b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
368c0 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
368d0 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
368e0 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
368f0 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
36900 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
36910 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
36920 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
36930 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
36940 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
36950 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
36960 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
36970 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
36980 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
36990 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
369a0 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
369b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
369c0 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
369d0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
369e0 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
369f0 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
36a00 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
36a10 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
36a20 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
36a30 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
36a40 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
36a50 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
36a60 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
36a70 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
36a80 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
36a90 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
36aa0 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
36ab0 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
36ac0 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
36ad0 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
36ae0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
36af0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
36b00 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
36b10 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73  r->errCode;.  as
36b20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
36b30 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
36b40 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
36b50 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52  tate<PAGER_ERROR
36b60 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
36b70 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
36b80 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
36b90 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
36ba0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36bb0 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20  ER_READER) ){.  
36bc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36bd0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
36be0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
36bf0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
36c00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
36c10 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66  he pager is conf
36c20 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f  igured to use lo
36c30 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
36c40 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20  sive, and an.   
36c50 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20     ** exclusive 
36c60 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
36c70 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  base is not alre
36c80 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e  ady held, obtain
36c90 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a   it now..      *
36ca0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
36cb0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
36cc0 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
36cd0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
36ce0 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29  ger->pWal, -1) )
36cf0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
36d00 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
36d10 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
36d20 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
36d30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36d40 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
36d50 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
36d60 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
36d70 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
36d80 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
36d90 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 1);.      }.
36da0 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74  .      /* Grab t
36db0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
36dc0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49   the log file. I
36dd0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70  f successful, up
36de0 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a  grade to.      *
36df0 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
36e00 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
36e10 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
36e20 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
36e30 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  aller..      ** 
36e40 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  The busy-handler
36e50 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20   is not invoked 
36e60 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  if another conne
36e70 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20  ction already.  
36e80 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65      ** holds the
36e90 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20   write-lock. If 
36ea0 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70  possible, the up
36eb0 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63  per layer will c
36ec0 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f  all it..      */
36ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
36ee0 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
36ef0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
36f00 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d  er->pWal);.    }
36f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  else{.      /* O
36f20 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
36f30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
36f40 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
36f50 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65  he exFlag parame
36f60 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ter.      ** is 
36f70 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64  true, then immed
36f80 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74  iately upgrade t
36f90 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  his to an EXCLUS
36fa0 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
36fb0 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
36fc0 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
36fd0 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
36fe0 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
36ff0 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a  XCLUSIVE.      *
37000 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20  * lock, but not 
37010 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74  when obtaining t
37020 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
37030 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
37040 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
37050 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  b(pPager, RESERV
37060 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
37070 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37080 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20  K && exFlag ){. 
37090 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
370a0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
370b0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
370c0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
370d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
370e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
370f0 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
37100 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  to WRITER_LOCKED
37110 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
37120 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
37130 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53  de sets Pager.eS
37140 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52  tate to PAGER_WR
37150 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43  ITER_LOCKED or C
37160 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a  ACHEMOD.      **
37170 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20   when it has an 
37180 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  open transaction
37190 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44  , but never to D
371a0 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44  BMOD or FINISHED
371b0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
371c0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68  is because in th
371d0 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63  ose states the c
371e0 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ode to roll back
371f0 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
37200 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
37210 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20  s may copy data 
37220 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
37230 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61  rnal into the da
37240 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a  tabase .      **
37250 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73   file as well as
37260 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63   into the page c
37270 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c  ache. Which woul
37280 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69  d be incorrect i
37290 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20  n .      ** WAL 
372a0 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mode..      */. 
372b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
372c0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
372d0 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  ER_LOCKED;.     
372e0 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
372f0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
37300 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
37310 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
37320 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
37330 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
37340 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
37350 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
37360 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
37370 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lOff = 0;.    }.
37380 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
37390 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
373a0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
373b0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
373c0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
373d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
373e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
373f0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
37400 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  ;.    assert( as
37410 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37420 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a  (pPager) );.  }.
37430 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
37440 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
37450 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
37460 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r)));.  return r
37470 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
37480 65 20 70 61 67 65 20 70 50 67 20 6f 6e 74 6f 20  e page pPg onto 
37490 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
374a0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
374b0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
374c0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70  E_NOINLINE int p
374d0 61 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c  agerAddPageToRol
374e0 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48  lbackJournal(PgH
374f0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
37500 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
37510 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
37520 63 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  c;.  u32 cksum;.
37530 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
37540 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61    i64 iOff = pPa
37550 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
37560 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64  ..  /* We should
37570 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
37580 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37590 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
375a0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
375b0 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
375c0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
375d0 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
375e0 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
375f0 6e 6f 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  not. */.  assert
37600 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
37610 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
37620 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
37630 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37640 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Hdr<=pPager->jou
37650 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44  rnalOff );.  COD
37660 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 2d  EC2(pPager, pPg-
37670 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e  >pData, pPg->pgn
37680 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
37690 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
376a0 70 44 61 74 61 32 29 3b 0a 20 20 63 6b 73 75 6d  pData2);.  cksum
376b0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
376c0 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
376d0 61 32 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20  a2);..  /* Even 
376e0 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b  if an IO or disk
376f0 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72  full error occur
37700 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c  s while journall
37710 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ing the.  ** pag
37720 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  e in the block a
37730 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65  bove, set the ne
37740 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72  ed-sync flag for
37750 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
37760 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20  Otherwise, when 
37770 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
37780 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
37790 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 2a  the logic in.  *
377a0 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
377b0 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
377c0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
377d0 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
377e0 72 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  red.  ** in the 
377f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
37800 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  nd if an IO erro
37810 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64  r occurs while d
37820 6f 69 6e 67 20 73 6f 2c 0a 20 20 2a 2a 20 74 68  oing so,.  ** th
37830 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  en corruption ma
37840 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  y follow..  */. 
37850 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
37860 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
37870 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
37880 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
37890 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   iOff, pPg->pgno
378a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
378b0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
378c0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
378d0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
378e0 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
378f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
37900 20 69 4f 66 66 2b 34 29 3b 0a 20 20 69 66 28 20   iOff+4);.  if( 
37910 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37920 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
37930 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
37940 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b  ager->jfd, iOff+
37950 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
37960 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66  +4, cksum);.  if
37970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37980 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
37990 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
379a0 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
379b0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
379c0 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
379d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
379e0 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
379f0 53 69 7a 65 29 29 3b 0a 20 20 50 41 47 45 52 5f  Size));.  PAGER_
37a00 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
37a10 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29  er_writej_count)
37a20 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
37a30 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
37a40 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
37a50 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
37a60 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
37a70 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
37a80 2c 20 0a 20 20 20 20 20 20 20 28 28 70 50 67 2d  , .       ((pPg-
37a90 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
37aa0 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61  D_SYNC)?1:0), pa
37ab0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
37ac0 29 29 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e  )));..  pPager->
37ad0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20  journalOff += 8 
37ae0 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
37af0 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52  ze;.  pPager->nR
37b00 65 63 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  ec++;.  assert( 
37b10 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37b20 61 6c 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  al!=0 );.  rc = 
37b30 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
37b40 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
37b50 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
37b60 0a 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d  .  testcase( rc=
37b70 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
37b80 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
37b90 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
37ba0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
37bb0 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76    rc |= addToSav
37bc0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
37bd0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
37be0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
37bf0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
37c00 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
37c10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37c20 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69  ./*.** Mark a si
37c30 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61  ngle data page a
37c40 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65  s writeable. The
37c50 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
37c60 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61   into the .** ma
37c70 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  in journal or su
37c80 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71  b-journal as req
37c90 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61  uired. If the pa
37ca0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
37cb0 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  to.** one of the
37cc0 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63   journals, the c
37cd0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
37ce0 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a   is set in the .
37cf0 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
37d00 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74  nal bitvec and t
37d10 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
37d20 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
37d30 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79  itvecs.** of any
37d40 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
37d50 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
37d60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37d70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
37d80 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
37d90 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
37da0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
37db0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
37dc0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
37dd0 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e  is not called un
37de0 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74 72 61  less a write-tra
37df0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
37e00 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20  eady .  ** been 
37e10 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75  started. The jou
37e20 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72  rnal file may or
37e30 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e   may not be open
37e40 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a   at this point..
37e50 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72    ** It is never
37e60 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45   called in the E
37e70 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f  RROR state..  */
37e80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37e90 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37ea0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
37eb0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37ec0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37ed0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
37ee0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37ef0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37f00 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
37f10 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
37f20 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
37f30 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
37f40 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
37f50 64 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  de==0 );.  asser
37f60 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  t( pPager->readO
37f70 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 43 48 45 43  nly==0 );.  CHEC
37f80 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
37f90 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
37fa0 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
37fb0 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c  opened. Higher l
37fc0 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61  evel routines ha
37fd0 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
37fe0 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63  obtained the nec
37ff0 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20  essary locks to 
38000 62 65 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d  begin the write-
38010 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
38020 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61   the.  ** rollba
38030 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  ck journal might
38040 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e   not yet be open
38050 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66  . Open it now if
38060 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
38070 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
38080 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
38090 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
380a0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
380b0 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a  ) on the page. .
380c0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
380d0 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20  if it were done 
380e0 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71  after calling sq
380f0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
38100 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a  irty(), then.  *
38110 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74  * an error might
38120 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20 70   occur and the p
38130 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75  ager would end u
38140 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  p in WRITER_LOCK
38150 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69  ED state.  ** wi
38160 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65 64 20  th pages marked 
38170 61 73 20 64 69 72 74 79 20 69 6e 20 74 68 65 20  as dirty in the 
38180 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cache..  */.  if
38190 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
381a0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
381b0 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72 63 20  OCKED ){.    rc 
381c0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
381d0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
381e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
381f0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
38200 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
38210 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
38220 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
38230 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  EMOD );.  assert
38240 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
38250 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
38260 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
38270 61 67 65 20 74 68 61 74 20 69 73 20 61 62 6f 75  age that is abou
38280 74 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64  t to be modified
38290 20 61 73 20 64 69 72 74 79 2e 20 2a 2f 0a 20 20   as dirty. */.  
382a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
382b0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 0a 20 20  eDirty(pPg);..  
382c0 2f 2a 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  /* If a rollback
382d0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6e 20 75   journal is in u
382e0 73 65 2c 20 74 68 65 6d 20 6d 61 6b 65 20 73 75  se, them make su
382f0 72 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  re the page that
38300 20 69 73 20 61 62 6f 75 74 0a 20 20 2a 2a 20 74   is about.  ** t
38310 6f 20 63 68 61 6e 67 65 20 69 73 20 69 6e 20 74  o change is in t
38320 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
38330 6e 61 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 70  nal, or if the p
38340 61 67 65 20 69 73 20 61 20 6e 65 77 20 70 61 67  age is a new pag
38350 65 20 6f 66 66 0a 20 20 2a 2a 20 74 68 65 6e 20  e off.  ** then 
38360 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c  end of the file,
38370 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
38380 20 6d 61 72 6b 65 64 20 61 73 20 50 47 48 44 52   marked as PGHDR
38390 5f 4e 45 45 44 5f 53 59 4e 43 2e 0a 20 20 2a 2f  _NEED_SYNC..  */
383a0 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
383b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
383c0 30 29 20 3d 3d 20 69 73 4f 70 65 6e 28 70 50 61  0) == isOpen(pPa
383d0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
383e0 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
383f0 75 72 6e 61 6c 21 3d 30 0a 20 20 20 26 26 20 73  urnal!=0.   && s
38400 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
38410 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 72 2d 3e  NotNull(pPager->
38420 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
38430 3e 70 67 6e 6f 29 3d 3d 30 0a 20 20 29 7b 0a 20  >pgno)==0.  ){. 
38440 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
38450 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
38460 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  0 );.    if( pPg
38470 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
38480 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
38490 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 64      rc = pagerAd
384a0 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a  dPageToRollbackJ
384b0 6f 75 72 6e 61 6c 28 70 50 67 29 3b 0a 20 20 20  ournal(pPg);.   
384c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
384d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
384e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
384f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
38500 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
38510 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52  eState!=PAGER_WR
38520 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20  ITER_DBMOD ){.  
38530 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
38540 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
38550 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  YNC;.      }.   
38560 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
38570 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
38580 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
38590 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
385a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
385b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
385c0 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
385d0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
385e0 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20  _SYNC)?1:0)));. 
385f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
38600 68 65 20 50 47 48 44 52 5f 44 49 52 54 59 20 62  he PGHDR_DIRTY b
38610 69 74 20 69 73 20 73 65 74 20 61 62 6f 76 65 20  it is set above 
38620 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 61  when the page wa
38630 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64  s added to the d
38640 69 72 74 79 2d 6c 69 73 74 0a 20 20 2a 2a 20 61  irty-list.  ** a
38650 6e 64 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  nd before writin
38660 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  g the page into 
38670 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
38680 72 6e 61 6c 2e 20 20 57 61 69 74 20 75 6e 74 69  rnal.  Wait unti
38690 6c 20 6e 6f 77 2c 0a 20 20 2a 2a 20 61 66 74 65  l now,.  ** afte
386a0 72 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62  r the page has b
386b0 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
386c0 20 6a 6f 75 72 6e 61 6c 6c 65 64 2c 20 62 65 66   journalled, bef
386d0 6f 72 65 20 73 65 74 74 69 6e